// Modified from https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/epoll-example.c #include #include #include #include #include #include #include #include #include #include #include #define MAXEVENTS 64 #define DEFAULT_PROC_NUM 3 static int create_and_bind() { int listenfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); if (listenfd < 0) { printf("create socket error: %s(errno: %d)\n", strerror(errno), errno); return -1; } struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6667); int reuse = 1; if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) perror("setsockopt port to reuse failed"); int ret = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); if (ret < 0) { printf("bind socket error: %s(errno: %d)\n", strerror(errno), errno); return -1; } return listenfd; } int main(int argc, char *argv[]) { int sfd = create_and_bind(); int s = listen(sfd, SOMAXCONN); if (s == -1) { perror("listen"); return -1; } int efd = epoll_create1(0); if (efd == -1) { perror("epoll_create"); return -1; } struct epoll_event event; event.data.fd = sfd; event.events = EPOLLIN | EPOLLET; s = epoll_ctl(efd, EPOLL_CTL_ADD, sfd, &event); if (s == -1) { perror("epoll_ctl"); return -1; } /* Buffer where events are returned */ struct epoll_event *events = calloc(MAXEVENTS, sizeof event); // spawn clients int client_pid; int proc_num = DEFAULT_PROC_NUM; char* client_argv[] = {"client", "127.0.0.1", "6667", NULL}; for(int i=0; i