Linux网络编程epoll模型

来源:互联网 发布:淘宝介入可以撤销吗 编辑:程序博客网 时间:2024/04/29 19:45
  1. #include <stdio.h>  
  2. #include <sys/types.h>  
  3. #include <sys/socket.h>  
  4. #include <sys/epoll.h>  
  5. #include <errno.h>  
  6. #include <netinet/in.h>  
  7. #include <unistd.h>  
  8. #include <arpa/inet.h>  
  9. #include <stdlib.h>  
  10.   
  11. #include <iostream>  
  12. using namespace std;  
  13.   
  14. #define LISTENQ 5   
  15. #define OPEN_MAX 1024  
  16. #define SERV_PORT  10088  
  17. #define MAX_LINE 1024  
  18. #define INFTIM -1   
  19.   
  20. #define MAXEVENTS 1000  
  21.   
  22. void echo_srv(int clientFd)  
  23. {  
  24.     //处理用户请求数据  
  25.     char line[MAX_LINE];  
  26.     cout << "开始读取数据" << endl;  
  27.     int n = read(clientFd, line, sizeof(line));  
  28.     if(n < 0)  
  29.     {  
  30.         //#define ECONNRESET 104  /* Connection reset by peer */  
  31.         if(errno == ECONNRESET)  
  32.         {  
  33.             close(clientFd);  
  34.             printf("异常退出\n");  
  35.         }  
  36.         else  
  37.         {  
  38.                 printf("网络异常");  
  39.                 exit(-1);  
  40.         }  
  41.     }  
  42.     else if(n == 0)  
  43.     {  
  44.         close(clientFd);  
  45.         printf("正常退出\n");  
  46.     }  
  47.     else  
  48.     {  
  49.         line[n] = 0;  
  50.         printf("接收到数据:%s\n", line);  
  51.         write(clientFd, line, n);  
  52.     }  
  53. }  
  54.   
  55. int main(int argc, char** argv)  
  56. {  
  57.     struct sockaddr_in cliaddr, servaddr;  
  58.     int listenFd = socket(AF_INET, SOCK_STREAM, 0);  
  59.     if( listenFd < 0)  
  60.     {  
  61.         printf("socket函数执行失败");  
  62.         return 1;  
  63.     }  
  64.       
  65.     servaddr.sin_family = AF_INET;  
  66.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  67.     //inet_aton('10.132.10.64', &(servaddr.sin_addr));  
  68.     //servaddr.sin_addr.s_addr = inet_addr("10.132.10.64");  
  69.     servaddr.sin_port = htons(SERV_PORT);  
  70.     if(bind(listenFd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)  
  71.     {  
  72.         printf("bind函数执行失败");  
  73.         return 1;  
  74.     }  
  75.       
  76.     if(listen(listenFd, LISTENQ) < 0)  
  77.     {  
  78.             printf("listen函数执行失败");  
  79.         return 1;  
  80.     }  
  81.     printf("listen函数执行成功\n");  
  82.     //epoll部分  
  83.     int epollFd;  
  84.     if ((epollFd = epoll_create(1)) == -1) {  
  85.         cerr << "create epoll_create falid" << endl;  
  86.         return false;  
  87.    }  
  88.      
  89.     epoll_event epollEvent;  
  90.     epollEvent.data.fd = listenFd;  
  91.     epollEvent.events = EPOLLIN | EPOLLET;  
  92.     if (epoll_ctl(epollFd, EPOLL_CTL_ADD, listenFd, &epollEvent) != 0)   
  93.     {  
  94.         cerr << "create epoll err!" << endl;  
  95.         return 1;  
  96.     }  
  97.         cout << "create epoll ok!" << endl;  
  98.         epoll_event *pEpollEvents = new epoll_event[MAXEVENTS];  
  99.           
  100.         while(true)  
  101.         {  
  102.             int n = epoll_wait(epollFd, pEpollEvents, MAXEVENTS, -1);  
  103.               
  104.             cout << "epoll wait conn" << endl;  
  105.             for(int i = 0; i < n; i++)  
  106.             {  
  107.                 epoll_event& e = pEpollEvents[i];  
  108.                 if((e.events & EPOLLERR) || (e.events & EPOLLHUP) || (!(e.events & EPOLLIN)))  
  109.                 {  
  110.                      cerr << "epoll error for client " << e.data.fd << endl;  
  111.                      close(e.data.fd);  
  112.                 }  
  113.                 else if(listenFd == e.data.fd)  //处理用户连接  
  114.                 {  
  115.                         socklen_t clilen = sizeof(cliaddr);  
  116.                         int connfd = accept(listenFd, (struct sockaddr*)&cliaddr, &clilen);  
  117.                         if(connfd < 0)  
  118.                         {  
  119.                             if ((errno != EAGAIN) && (errno != EWOULDBLOCK))   
  120.                             {  
  121.                     cerr << "fail to accept new client " << endl;  
  122.                     continue;  
  123.                   }  
  124.                         }  
  125.                         printf("Ip: %s 到此一游\n", inet_ntoa(cliaddr.sin_addr));  
  126.                           
  127.                         //将用户连接加入epoll中进行监视  
  128.                         e.data.fd = connfd;  
  129.                     e.events = EPOLLIN | EPOLLET;  
  130.                   if (epoll_ctl(epollFd, EPOLL_CTL_ADD, connfd, &e) != 0)   
  131.             {  
  132.                  cerr << "create epoll err!" << endl;  
  133.                  continue;  
  134.             }  
  135.                 }  
  136.                 else    
  137.                 {  
  138.                     echo_srv(e.data.fd);  
  139.                 }  
  140.                   
  141.             }  
  142.         }  
  143. }
原创粉丝点击