int main(int argc, char const *argv[]) { struct epoll_event ev, events[MAX_EVENTS]; int listen_sock, conn_sock, nfds, epollfd; struct sockaddr_in cliaddr, servaddr; int len, n; if (argc != 2) { fprintf(stderr, "usage: srvselect <port>\n"); exit(1); } if ((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket error"); exit(1); } servaddr.sin_family = AF_INET; servaddr.sin_port = htons(atoi(argv[1])); servaddr.sin_addr.s_addr = htons(INADDR_ANY); if (bind(listen_sock, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { perror("bind error"); exit(1); } if (listen(listen_sock, LISTENQ) < 0) { perror("listen error"); exit(1); } epollfd = epoll_create(10); if (epollfd == -1) { perror("epoll_create"); exit(EXIT_FAILURE); } ev.events = EPOLLIN; ev.data.fd = listen_sock; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) { perror("epoll_ctl: listen_sock"); exit(EXIT_FAILURE); } for (;;) { nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1); if (nfds == -1) { perror("epoll_pwait"); exit(EXIT_FAILURE); } for (n = 0; n < nfds; ++n) { if (events[n].data.fd == listen_sock) { conn_sock = accept(listen_sock, (struct sockaddr *) &cliaddr, &len); if (conn_sock == -1) { perror("accept"); exit(EXIT_FAILURE); } setnonblocking(conn_sock); ev.events = EPOLLIN; ev.data.fd = conn_sock; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock, &ev) == -1) { perror("epoll_ctl: conn_sock"); exit(EXIT_FAILURE); } } else { do_use_fd(events[n].data.fd); } } } return 0; }
int main(int argc, char** argv) { if(argc != 2) { printf("Usage: %s <listen port>\n", argv[0]); return 1; } unsigned short port = (unsigned short)atoi(argv[1]); int listen_sock = create_listen_socket(port); if (listen_sock == -1) { return 3; } int epollfd = epoll_create(MAX_EVENTS); if (epollfd == -1) { perror("epoll_create"); return 4; } struct epoll_event ev, events[MAX_EVENTS]; ev.events = EPOLLIN; ev.data.fd = listen_sock; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) { perror("epoll_ctl: listen_sock"); return 5; } int nfds = 0; for(;;) { nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1); if (nfds == -1) { perror("epoll_wait"); return 6; } int n; for (n= 0; n < nfds; ++n) { if(events[n].data.fd == listen_sock) { struct sockaddr_in peer_addr; int addrlen = sizeof(peer_addr); int conn_sock = accept(listen_sock, (struct sockaddr*)&peer_addr, (socklen_t*)&addrlen); if(conn_sock == -1) { perror("accept"); return 7; } printf("[accept] addr: %s, port: %hu, fd: %d\n", inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port), conn_sock); if(setnonblocking(conn_sock) == 0) { ev.events = EPOLLIN | EPOLLET; ev.data.fd = conn_sock; if(epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock, &ev) == -1) { perror("epoll_ctl: conn_sock"); close(conn_sock); } } } else { if(do_use_fd(events[n].data.fd) == -1) { epoll_ctl(epollfd, EPOLL_CTL_DEL, events[n].data.fd, NULL); close(events[n].data.fd); printf("[close %d]\n", events[n].data.fd); } } } } return 0; }