最大的好处就是返回的events都是有事件的fd。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/epoll.h> #include <vector> #define BUF_SIZE 100 #define EPOLL_SIZE 2 void error_handling(char *buf); int main(int argc, char *argv[]) { int serv_sock, clnt_sock; struct sockaddr_in serv_adr, clnt_adr; socklen_t adr_sz; int str_len, i; char buf[BUF_SIZE]; std::vector<epoll_event> ep_events; ep_events.resize(EPOLL_SIZE); struct epoll_event event; int epfd, event_cnt; if(argc!=2) { printf("Usage : %s <port>\n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_STREAM, 0); memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr.sin_family=AF_INET; serv_adr.sin_addr.s_addr=htonl(INADDR_ANY); serv_adr.sin_port=htons(atoi(argv[1])); if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr))==-1) error_handling("bind() error"); if(listen(serv_sock, 5)==-1) error_handling("listen() error"); //epfd=epoll_create(EPOLL_SIZE); epfd = epoll_create1(EPOLL_CLOEXEC); event.events=EPOLLIN; event.data.fd=serv_sock; epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &event); while(1) { event_cnt=epoll_wait(epfd, &*ep_events.begin(), ep_events.size(), -1); if(event_cnt==-1) { puts("epoll_wait() error"); break; } if (static_cast<size_t>(event_cnt) == ep_events.size()) { ep_events.resize(ep_events.size() * 2); } for(i=0; i<event_cnt; i++) { if(ep_events[i].data.fd==serv_sock) { adr_sz=sizeof(clnt_adr); clnt_sock= accept(serv_sock, (struct sockaddr*)&clnt_adr, &adr_sz); event.events=EPOLLIN; event.data.fd=clnt_sock; epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &event); printf("connected client: %d \n", clnt_sock); } else { str_len=read(ep_events[i].data.fd, buf, BUF_SIZE); if(str_len==0) // close request! { epoll_ctl( epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL); close(ep_events[i].data.fd); printf("closed client: %d \n", ep_events[i].data.fd); } else { write(ep_events[i].data.fd, buf, str_len); // echo! } } } } close(serv_sock); close(epfd); return 0; } void error_handling(char *buf) { fputs(buf, stderr); fputc('\n', stderr); exit(1); }