epoll实例—1

来源:互联网 发布:淘宝平台客服投诉电话 编辑:程序博客网 时间:2024/06/07 21:05
#include <iostream>#include <sys/socket.h>#include <sys/epoll.h>#include <netinet/in.h>#include <arpa/inet.h>#include <fcntl.h>#include <unistd.h>#include <errno.h>#include <stdio.h>using namespace std;#define MAXLINE 5#define OPEN_MAX 100#define LISTENQ20#define SERV_PORT 9527#define INFTIM 1000void setnonblocking(int sock){int opts;opts = fcntl(sock, F_GETFL);if(opts < 0){printf("fcntl(sock,f_getfl) error\n");exit(1);}opts = opts | O_NONBLOCK;if(fcntl(sock, F_SETFL, opts) < 0){printf("fcntl set error\n");exit(1);}}int main(){int i, maxi, listenfd, connfd, sockfd, epfd, nfds, portnumber;ssize_t n;char line[MAXLINE];socklen_t clilen;struct sockaddr_in servaddr, cliaddr;const char*ip = "192.168.11.203";struct epoll_event ev, events[20];epfd = epoll_create(256);listenfd = socket(AF_INET, SOCK_STREAM, 0);ev.data.fd = listenfd;ev.events = EPOLLIN|EPOLLET;epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev);memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, ip, &servaddr.sin_addr);bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));listen(listenfd, LISTENQ);maxi = 0;for(;;){nfds = epoll_wait(epfd, events, 20, 500);for(int i = 0; i < nfds; i++){if(events[i].data.fd == listenfd){clilen = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr*)&cliaddr,&clilen);if(connfd < 0){printf("accept error\n");exit(1);}char cli_ip[64] = {0};inet_ntop(AF_INET, &cliaddr.sin_addr,cli_ip, sizeof(cli_ip));cout<<"accept a connect from "<< cli_ip <<endl;ev.data.fd = connfd;ev.events = EPOLLIN|EPOLLET;epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, &ev);}else if(events[i].events & EPOLLIN){cout<<"epoll in"<<endl;if((sockfd = events[i].data.fd) < 0){continue;}if((n=read(sockfd, line, MAXLINE)) < 0){if(errno == ECONNRESET){close(sockfd);events[i].data.fd = -1;}else{cout<<"readline error"<<endl;}}else if(n == 0){close(sockfd);events[i].data.fd = -1;}line[n] = '\0';cout<<"read"<< line <<endl;ev.data.fd = sockfd;ev.events = EPOLLOUT|EPOLLET;}else if(events[i].events&EPOLLOUT){sockfd = events[i].data.fd;write(sockfd, line, n);ev.data.fd = sockfd;ev.events = EPOLLIN|EPOLLET;epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, &ev);}}}  }