Пример #1
0
int main (int argc, char **argv) {
    int targc = argc - 1;
    char **targv = argv + 1;
    char *worldname = "demo";
    const char* datadir = getenv("GLBUMPER_DATA");
    if (!datadir) {
	datadir = ".";
    }

    int fps = 25;

    int port = 20200;

    srand(time(NULL));

    SDL_Init (SDL_INIT_NOPARACHUTE);
    sock_init();

#ifdef WIN32
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)console_ctrl_handler, TRUE);
#else
    signal(SIGINT, sigint);
    signal(SIGTERM, sigint);

#endif

    while (targc) {
	if (**targv == '-') {
	    if (!strcmp (*targv + 1, "p")) {
		targc--;
		port = atoi(*++targv);
	    } else if (!strcmp (*targv + 1, "D")) {
		if (!targc--) usage(argv[0]);
		datadir = *++targv;
	    } else if (!strcmp (*targv + 1, "fps")) {
		targc--;
		fps = atoi(*++targv);
	    } else {
		usage(argv[0]);
	    }
	} else {
	    worldname = *targv;
	}
	targc--;
	targv++;
    }

    FileResourceLoader::set_data_dir(datadir);
    
    int framems = 1000/fps;

    init_engine();

    Socket::init();

    sptr<ServerThread> svr = GC::track(new ServerThread(framems));

    svr->loadworld(worldname);

    svr->listen(port);


    svr->start();

    while (!server_exit && svr->isrunning()) {
	dsleep(0.5);
    };

    cout << "\n\n\nGot signal, exiting" << endl;

    svr->stop();

    svr = NULL;

    cout << "\nBefore collection:\n";
    GC::printstats();
    GC::collect();
    cout << "After collection:\n";
    GC::printstats();
    //GC::printobjects();

    cout<<endl;
    SDL_Quit ();
    return 0;
}
Пример #2
0
int main (int argc, char **argv)
{

    int opt;
    char *configfile = "hosts";
    JRB hosts, node, node2;
    Host *host, *join, *me;
    int nhosts;
    int i, j;
    Message *m;
    char dest[160];
    char msg[256];
    Key tmp;
    ChimeraHost ch;
    double start;

    while ((opt = getopt (argc, argv, OPTSTR)) != EOF)
	{
	    switch ((char) opt)
		{
		case 'f':
		    configfile = optarg;
		    break;
		default:
		    fprintf (stderr, "invalid option %c\n", (char) opt);
		    fprintf (stderr, "usage: %s\n", USAGE);
		    exit (1);
		}
	}

    sem = sema_create (0);
    state = (ChimeraState *) malloc (sizeof (ChimeraState));

    me = (Host *) malloc (sizeof (Host));
    me->name = "localhost";
    me->port = 11110;
    me->hnp = "localhost:11110";

    hosts = read_hosts (configfile, &nhosts);

    state->log = log_init ();
    log_direct (state->log, LOG_ERROR, stderr);
    log_direct (state->log, LOG_WARN, stderr);

    key_init ();
    state->message = message_init (state, 11110);
    message_handler (state, 21, hello, 1);
    message_handler (state, 22, fwd, 1);
    message_handler (state, 23, del, 1);
    message_handler (state, 24, NULL, 1);

    srand (time (NULL));

/* This part runs bighost in different hosts */

    announced = 0;
    jrb_traverse (node, hosts)
    {
	if (announced == 0)
	    {
		join = NULL;
	    }
	else
	    {
		i = (rand () % announced) + 1;
		jrb_traverse (node2, hosts)
		{
		    i--;
		    if (i == 0)
			break;
		}
		join = (Host *) node2->val.v;
	    }
	host = (Host *) node->val.v;

	start_host (host, join);
	dsleep (0.1);
    }
Пример #3
0
static int ufw_send(ufw_sk *sk){
	struct timeval time;
	struct node *cur;
	struct hookinfo *hki;
	struct iphdr *ip;
	struct sockaddr_in addr;
	double delay;
	int r;
	static struct timeval last = {0, 0};
	size_t len;

	if(!sk){
		errno = EBADF;
		return -1;
	}

	ip = (struct iphdr *)sk->sendbuf;
	len = ntohs(ip->tot_len);
	delay = 0;

	if(sk->limit_byte > 0)
		delay = (double)len/sk->limit_byte;
	if(sk->limit_packet > 0 
	&& (ip->protocol == IPPROTO_UDP 
		|| (sk->limit_packet_flags & sk->sendbuf[(ip->ihl << 2) + 13]))
	&& 1./sk->limit_packet > delay)
		delay = 1./sk->limit_packet;

	gettimeofday(&time, NULL);
	if(last.tv_sec){
		delay -= time.tv_sec - last.tv_sec + (time.tv_usec - last.tv_usec)/1e6;
		if(delay > 0)
			dsleep(delay);
	}
	gettimeofday(&last, NULL);


	do{
		addr.sin_family = AF_INET;
		addr.sin_port = sk->proto;
		addr.sin_addr.s_addr = sk->daddr;
		r = sendto(sk->fd, sk->sendbuf, len, 0, (struct sockaddr *)&addr, sizeof(addr));
	}while(r < 0 && errno == EAGAIN);

	gettimeofday(&time, NULL);

	if(!sk->first_packet.tv_sec)
		sk->first_packet = time;
	if(r < 0){
		if(sk->opts & FATAL)die("sendto");
		return -1;
	}

	for(cur = sk->sendhook; cur; cur = cur->next){
		hki = cur->data;
		if(!hki->func(sk->sendbuf, &time, 1, hki->user))
			return r;
	}

	if((sk->opts & DUMP_SEND) && sk->dump)
		dump_write(sk->dump, sk->sendbuf, 0, &time);

	time.tv_sec -= sk->first_packet.tv_sec;
	time.tv_usec -= sk->first_packet.tv_usec;
	if(time.tv_usec < 0)time.tv_usec += 1000000;

	if(sk->opts & PRINT_SEND)
		print_packet(sk->sendbuf, &time, 1);

	return r;
}