#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_EVENTS 512 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) static inline void print_usage(char *progname); int socket_server_init(char *listen_ip, int listen_port); void set_socket_rlimit(void); int main(int argc, char **argv) { int listenfd, connfd; int serv_port = 0; int daemon_run = 0; char *progname = NULL; int opt; int rv; int i, j; int found; char buf[1024]; int epollfd; struct epoll_event event; struct epoll_event event_array[MAX_EVENTS]; int events; struct option long_options[] = { {"daemon", no_argument, NULL, 'b'}, {"port", required_argument, NULL, 'p'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} }; progname = basename(argv[0]); /* Parser the command line parameters */ while ((opt = getopt_long(argc, argv, "bp:h", long_options, NULL)) != -1) { switch (opt) { case 'b': daemon_run=1; break; case 'p': serv_port = atoi(optarg); break; case 'h': /* Get help information */ print_usage(progname); return EXIT_SUCCESS; default: break; } } if( !serv_port ) { print_usage(progname); return -1; } set_socket_rlimit(); /* set max open socket count */ if( (listenfd=socket_server_init(NULL, serv_port)) < 0 ) { printf("ERROR: %s server listen on port %d failure\n", argv[0],serv_port); return -2; } printf("%s server start to listen on port %d\n", argv[0],serv_port); /* set program running on background */ if( daemon_run ) { daemon(0, 0); } if( (epollfd=epoll_create(MAX_EVENTS)) < 0 ) { printf("epoll_create() failure: %s\n", strerror(errno)); return -3; } //event.events = EPOLLIN|EPOLLET; event.events = EPOLLIN; event.data.fd = listenfd; if( epoll_ctl(epollfd, EPOLL_CTL_ADD, listenfd, &event) < 0) { printf("epoll add listen socket failure: %s\n", strerror(errno)); return -4; } for ( ; ; ) { /* program will blocked here */ events = epoll_wait(epollfd, event_array, MAX_EVENTS, -1); if(events < 0) { printf("epoll failure: %s\n", strerror(errno)); break; } else if(events == 0) { printf("epoll get timeout\n"); continue; } /* rv>0 is the active events count */ for(i=0; i