服务器中采用的epoll 技术的完整例子(附加一个客户端的例子) /* *\ 服务器端的源代码 */ #include #include #include #include #include #include #include #define MAXFDS 256 #define EVENTS 100 #define PORT 8888 int epfd; bool setNonBlock(int fd) { int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; if(-1 == fcntl(fd, F_SETFL, flags)) return false; return true; } int main(int argc, char* argv[], char* evp[]) { int fd, nfds, confd; int on = 1; char* buffer[512]; struct sockaddr_in saddr, caddr; struct epoll_event ev, events[EVENTS]; if(-1 == socket(AF_INET, SOCKSTREAM), 0) { std::cout << "创建套接字出错啦" << std::endl; return -1; } struct sigaction sig; sigemptyset(&sig.sa_mask); sig_handler = SIG_IGN; sigaction(SIGPIPE, &sig, NULL); epfd = epoll_create(MAXFDS); setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons((short)(PORT)); saddr.sin_addr.s_addr = INADDR_ANY; if(-1 == bind(fd, (struct sockaddr*)&saddr, sizeof(saddr))) { std::cout << "套接字不能绑定到服务器上" << std::endl; return -1; } if(-1 == listen(fd, 32)) { std::cout << "监听套接字的时候出错了" << std::endl; return -1; } ev.data.fd = fd; ev.events = EPOLLIN; epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev); while(true) { nfds = epoll_wait(epfd, &events, MAXFDS, 0); for(int i=0; i < nfds; ++ i) { if(fd == events[i].data.fd) { memset(&caddr, sizeof(caddr)); cfd = accept(fd, (struct sockaddr*)&caddr, &sizeof(caddr)); if(-1 == cfd) { std::cout << "服务器接收套接字的时候出问题了" << std::endl; break; } setNonBlock(cfd); ev.data.fd = cfd; ev.events = EPOLLIN; epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &ev); } else if(events[i].data.fd & E...