Example #1
0
/**
 * Listen on the various configured interfaces
 */
int child_listening_sockets(vector_t listen_addrs, uint16_t port)
{
    int ret;
    ssize_t i;

    assert (port > 0);

    if (listen_fds == NULL) {
        listen_fds = vector_create();
        if (listen_fds == NULL) {
            log_message (LOG_ERR, "Could not create the list "
                         "of listening fds");
            return -1;
        }
    }

    if ((listen_addrs == NULL) ||
            (vector_length(listen_addrs) == 0))
    {
        /*
         * no Listen directive:
         * listen on the wildcard address(es)
         */
        ret = listen_sock(NULL, port, listen_fds);
        return ret;
    }

    for (i = 0; i < vector_length(listen_addrs); i++) {
        const char *addr;

        addr = (char *)vector_getentry(listen_addrs, i, NULL);
        if (addr == NULL) {
            log_message(LOG_WARNING,
                        "got NULL from listen_addrs - skipping");
            continue;
        }

        ret = listen_sock(addr, port, listen_fds);
        if (ret != 0) {
            return ret;
        }
    }

    return 0;
}
Example #2
0
static void async_acceptor(boost::asio::yield_context yielder, int port, RSA * privatekey, X509 * x509_cert)
{
	// 创建 tcp 端口,进入监听
	boost::asio::ip::tcp::acceptor listen_sock(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), port));

	while(true)
	{
		boost::system::error_code ec;
		boost::shared_ptr<boost::asio::ip::tcp::socket> client_sock(new boost::asio::ip::tcp::socket(io_service));
		listen_sock.async_accept(*client_sock, yielder[ec]);

		// 进入 client 处理
		if(!ec)
			boost::asio::spawn(io_service, boost::bind(&process_client, _1, client_sock, privatekey, x509_cert));
	}
}
Example #3
0
void debug_loop(int argc, char *argv[], void (*loop)(void)) {

  listen_port = atoi(argv[1]);
  argc-=2;
  argv++; argv++;
  int listen_fd = listen_sock();
  struct sockaddr_in cli_addr;
  socklen_t cli_addr_len;


  if(argc >= 1 && !strcmp(argv[0], "-f")) {
    argc--;
    argv++;
    fprintf(stderr, "Start fork-pool\r\n");

    while(1) {
      pid_t child;
      if((child = fork()) == 0) {

        int cli_sock = accept(listen_fd, (struct sockaddr *)&cli_addr, &cli_addr_len);
        in_fd = out_fd = cli_sock;
        // setsockopt(in_fd, SOL_SOCKET, SO_LINGER, &true_, sizeof(true_));
        loop();
        shutdown(cli_sock, SHUT_RDWR);
        _exit(0);
      } else {
        int stat_loc;
        struct rusage rusage;
        wait4(child, &stat_loc, 0, &rusage);
        if(WIFSIGNALED(stat_loc)) {
          fprintf(stderr, "Child process was signalled by %d\r\n", WTERMSIG(stat_loc));
        } else if(WIFEXITED(stat_loc)) {
          if(WEXITSTATUS(stat_loc) != 0)
            fprintf(stderr, "Child process exited with code %d\r\n", WEXITSTATUS(stat_loc));
        } else {
          fprintf(stderr, "Child process exited due to unknown reason\r\n");
        }
        fprintf(stderr, "\r\n");
      }
    }      
  } else {
    int cli_sock = accept(listen_fd, (struct sockaddr *)&cli_addr, &cli_addr_len);
    in_fd = out_fd = cli_sock;
    loop();
    _exit(0);
  }  
}
Example #4
0
                object *socket::listen(integer *queue)
                {
                    if (socket_val < 0)
                    {
                        exceptions::SocketError *exc = exceptions::SocketError::Create(
                            1,
                            new string("Socket already closed.")
                        );
                        exc->throw_exception();
                    }
                    
                    int ret = listen_sock(socket_val, queue->val);
                    if (ret < 0)
                    {
                        exceptions::SocketError *exc = exceptions::SocketError::Create(
                            1,
                            new string("Error while listening on socket.")
                        );
                        exc->throw_exception();
                    }

                    return new boolean(true);
                }
Example #5
0
int TCP_sock_rcv(in_port_t port){
	int sock, sock_rcv;
	int porta;
	struct sockaddr_in Local, From;
	char ipstr[15];

	porta = ntohs(port);

	sock = get_sock(SOCK_STREAM);
	set_sock(sock);
	name_sock(&Local, htonl(INADDR_ANY), port);
	bind_sock(sock, &Local);
	listen_sock(sock);

	printf("Attendo una connessione TCP sulla porta %d\n\n", porta);

	sock_rcv = accept_sock(sock, &From);

	inet_ntop(AF_INET, &From.sin_addr, ipstr,(socklen_t)15); /* conversione a stringa dell'ip per stamparlo */

	printf("Connessione TCP da %s : %d\n\n", ipstr,	ntohs(From.sin_port));

	return sock_rcv;
}
Example #6
0
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("usage: ./server <#port>\n");
        exit(EXIT_FAILURE);
    }
    int port = atoi(argv[1]);

    /* SIGCHLD handler */
    struct sigaction sigchld;
    sigchld.sa_handler = chld_handler;
    sigemptyset(&sigchld.sa_mask);
    sigchld.sa_flags = 0;
    sigaction(SIGCHLD,&sigchld,NULL);

    int listenfd = bind_sock(port);

    listen_sock(listenfd);

    handle_connection(listenfd);

    return 0;
}
Example #7
0
int child_listening_sock (uint16_t port)
{
        listenfd = listen_sock (port, &addrlen);
        return listenfd;
}
Example #8
0
File: main.c Project: akalend/mymc
int main(int argc, char **argv){

	int mc_sock;
	addr_t mc_addr;	
	ev_io  mc_io;
	sophiadb_t * db;		
	int c;	
	
	
	while (1) {
		int option_index = 0;
		static struct option long_options[] = {
			{"help",		no_argument,		0, 'h'},
			{"version",		no_argument,		0, 'V'},
			{"max-clients",	required_argument,	0, 'l'},
			{0, 0, 0, 0}
		};
		c = getopt_long(argc, argv, "n:Vc:t", long_options, &option_index);
		if (c == -1)
			break;
		switch (c) {
			case 'c':
				confilename = optarg;
				break;
			case 'n':
				max_clients = atoi(optarg);
				break;
			case 'V':
				printf("Version %s\n",  MYMC_VERSION);
				exit(0);
			case 't':
				is_trace = 1;
				break;			default:
				usage(argv[0], c == 'h' ? EXIT_SUCCESS : EXIT_FAILURE);
		}
	}
	

	if (confilename) 
		parse(confilename, &server_ctx);
	else	
		parse( CONFIGFILE, &server_ctx);

	//assert(server_ctx.logfile);
	//assert(server_ctx.listen);
	
	if (!server_ctx.listen) {
		perror("undefined listen port");
		exit(1);
	}
	

	flog =  server_ctx.logfile ? fopen(server_ctx.logfile, "a+") : fopen("error.log", "a+");
	
	if (flog) {		
		time_t lt;
  		lt = time(NULL);
  		fprintf(flog, "server started at %s\n",ctime(&lt));	
	}	else {
			perror("can not create log file");
			exit(1);
		}

	daemonize(server_ctx.is_demonize, server_ctx.pidfile, server_ctx.username);

	set_rlimit();	
	ignore_sigpipe();
		
	init_addr(&mc_addr, server_ctx.listen);

	mc_sock = socket(mc_addr.pf_family, SOCK_STREAM, 0);
	if (mc_sock < 0) {
		perror("can't create socket");
		exit(1);
	}

	listen_sock(mc_sock, &mc_addr);
	
	//TODO	
	if (is_trace)
		printf("pid=%ld\n\n", (long)getpid());
	
	clients = calloc(max_clients, sizeof(fd_ctx));
	if (!clients) {
		perror_fatal("Cannot allocate array for client descriptors!");		
	}

	int i=0;
	while(i < max_clients) {
		if(clients[i].mc) 
			printf("init err %i\n", i);
		i++;
	}
		
	db = db_init(&server_ctx);
	assert(db);
	
	struct ev_loop *loop = ev_default_loop(0);	
	assert(loop);
	
	ev_set_userdata(loop,(void*)db);	
		
	ev_io_init(  &mc_io, memcached_on_connect, mc_sock, EV_READ);		
	ev_io_start(loop, &mc_io);

	struct ev_timer timeout_watcher;	

	ev_init(&timeout_watcher, periodic_watcher);
	timeout_watcher.repeat = TIME_CHECK_INTERVAL;
	ev_timer_again(loop, &timeout_watcher);

	struct ev_signal signal_watcher,signal_watcher2;
	
//	ev_signal_init (&signal_watcher, sigint_cb, SIGINT);
//	ev_signal_start (loop,  &signal_watcher);
	
	ev_signal_init (&signal_watcher, sigint_cb, SIGTERM);
	ev_signal_start (loop,  &signal_watcher);

	ev_signal_init (&signal_watcher2, sighup_cb, SIGHUP);
	ev_signal_start (loop,  &signal_watcher2);
	

	//start server
	time(&stats.uptime);
	gettimeofday(&t_start, NULL);

	// event loop
	ev_loop(loop, 0);
	
	cllear_mc_all();	
	close(mc_sock);	
	
	if (clients) 
		free(clients);
	
	//ev_loop_destroy(loop);
	
	destroy(db);
	
	if (mc_addr.a_addr) free(mc_addr.a_addr);
	
	if (server_ctx.pidfile) {		
		if( unlink(server_ctx.pidfile))
			printf("cannot delete pid file %s %s\n",server_ctx.pidfile, strerror(errno));
	}	

	free_config(); 
	if (flog) {		
		time_t lt;
  		lt = time(NULL);
  		
  		fprintf(flog, "server finis Ok at %s\n",ctime(&lt));
		fclose(flog);	
	}

	return 0;
	 
}
Example #9
0
VOID Thread (PVOID pvoid)
{
	listenfd = listen_sock(port, &addrlen);
	close(listenfd);
	//return listenfd;
}
Example #10
0
int
main(int argc, char **argv)
{
	int x;

	umask(0077);

	/* initialize stuff */
	memset(&me, 0, sizeof(me));
	me.argc       = argc;
	me.argv       = argv;
	me.start      = time(NULL);
	me.settime    = time(NULL) + (60*60*4);

	/* setup signals */
	signal(SIGHUP,  do_signal);
	signal(SIGINT,  do_signal);
	signal(SIGQUIT, do_signal);
	signal(SIGILL,  do_signal);
	signal(SIGTRAP, do_signal);
	signal(SIGBUS,  do_signal);
	signal(SIGSEGV, do_signal);
	signal(SIGSYS,  do_signal);
	signal(SIGALRM, SIG_IGN);
	signal(SIGTERM, do_signal);
	signal(SIGPIPE, SIG_IGN);
	signal(SIGUSR1, SIG_IGN);
	signal(SIGUSR2, SIG_IGN);

	while ((x = getopt(me.argc, me.argv, "qd")) != -1) {
		switch (x) {
			case 'd':
				me.debug = 1;
				break;
		}
	}

	if (me.debug == 0)
		printf("%s by %s\n", VER_STR, MYEMAIL);

	if (read_conf())
		err(1, "ERROR! Unable to read configuration file");

	if (!me.servname || !me.servdesc)
		errx(1, "ERROR! Your M: line is invalid, incomplete, or missing!");

	for (x = 0; x < ALL; x++)
		if (!me.sclients[x].nick || check_nick(NULL, me.sclients[x].nick) ||
			!me.sclients[x].username || check_um(NULL, me.sclients[x].username) ||
			!me.sclients[x].realname || check_rm(NULL, me.sclients[x].realname))
			errx(1, "ERROR! Your N: line for %d is invalid, incomplete, or missing!", x);

	if (!me.chans[0])
		errx(1, "ERROR! You need at least one R: line in %s", CONF);

	if (!(me.logfd = fopen(PIDFILE, "w")))
		err(1, "ERROR! Unable to open pidfile");
	fprintf(me.logfd, "%d\n", getpid());
	fclose(me.logfd);

	if (!(me.logfd = fopen(LOGFILE, "a")))
		err(1, "ERROR! Unable to open logfile");

	if ((x = read_db(0)) > 0)
		err(1, "ERROR! Unable to read %s", databases[x]);

	if (me.ip.s_addr == NULL) {
		if (!self_lookup())
			err(1, "ERROR! self-lookup failed!");
		else
			printf("WARNING: no vhost defined in conf, using default of %s\n", inet_ntoa(me.ip));
	}

	if (me.debug == 0)
		switch (me.pid = fork())
		{
			case -1:
				err(1, "ERROR! Unable to fork");
			case 0:
				for (x = 0; x < 12; x++)
					if (x != fileno(me.logfd))
						close(x);
				break;
			default:
				printf("forked into the background: pid = %d\n", me.pid);
				return 0;
		}
	listen_sock(7272);
	try_next_hub();
	add_event(1, SERVTIMEOUT / 2, &ping_hub);
	add_event(1, CONNTIMEOUT / 3, &cleanup_dcc);
	io_loop();
	/* NOTREACHED */
	exit(0);
}
Example #11
0
int main(int argc, char* argv[])
{
  parseArgs(argc, argv);

  config.Load(config_file);

  DPRINT(INFO, "Warmux index server version %i", VERSION);
  DPRINT(INFO, "%s", wx_clock.DateStr());

  Env::SetConfigClass(config);
  Env::SetWorkingDir();

  bool local, r;
  r = config.Get("local", local);
  if (!r)
    PRINT_FATAL_ERROR;

  if (!local)
    DownloadServerList();

  Env::SetChroot();

  Env::MaskSigPipe();

  // Set the maximum number of connection
  Env::SetMaxConnection();
  Env::SetupAutoReloadConf();

  stats.Init();

  int port = 0;
  config.Get("port", port);
  Server listen_sock(port);

  // Set of socket where an activity have been detected
  fd_set acting_sock_set;

  if (!local)
    sync_slave.Start();

  while(1)
    {
      wx_clock.HandleJobs(local);
      sync_slave.CheckGames();

      struct timeval timeout;
      memset(&timeout, 0, sizeof(timeout));
      timeout.tv_sec = 1;
      timeout.tv_usec = 0;

      acting_sock_set = listen_sock.GetSockSet();
      // Lock the process until activity is detected
      if ( select(FD_SETSIZE, &acting_sock_set, NULL, NULL, &timeout) < 1 )
        {
          // Timeout to check for other games on other servers
          if(timeout.tv_sec != 0 && timeout.tv_usec != 0)
            PRINT_FATAL_ERROR;
        }

      // Find the socket where activity have been detected:
      // First check for already established connections
      for(std::multimap<std::string,Client*>::iterator client = clients.begin();
          client != clients.end();
          ++client)
        {
          client->second->CheckState();

          if( ! client->second->connected )
            {
              // Connection closed
              DPRINT(CONN, "Closind FD %u from client %p\n", client->second->GetFD(), client->second);
              listen_sock.CloseConnection( client->second->GetFD() );
              delete client->second;
              clients.erase(client);
              DPRINT(CONN, "%i connections up!", (int)clients.size());
              break;
            }
          if( FD_ISSET( client->second->GetFD(), &acting_sock_set) )
            {
              if( ! client->second->Receive() ) {
                DPRINT(CONN, "Nothing received from client %p, disconnecting!", client->second);
                client->second->connected = false;
              }
              // Exit as the clients list may have changed
              break;
            }
        }

      // Then check if there is any new incoming connection
      if( FD_ISSET(listen_sock.GetFD(), &acting_sock_set) )
        {
          Client* client = listen_sock.NewConnection();
          if(client != NULL)
            clients.insert(std::make_pair("unknown", client ));
          DPRINT(CONN, "%i connections up!", (int)clients.size());

          // Exit as the 'clients' list may have changed
        }
    }
}