Linux网络编程poll模型

来源:互联网 发布:mac little snitch 编辑:程序博客网 时间:2024/06/06 03:39
  1. //分发进程  
  2. //listen   
  3.   
  4. #include <stdio.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7. #include <sys/poll.h>  
  8. #include <errno.h>  
  9. #include <netinet/in.h>  
  10. #include <unistd.h>  
  11. #include <arpa/inet.h>  
  12. #include <stdlib.h>  
  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. int main(int argc, char** argv)  
  21. {  
  22.     int err, maxpoll, nreadly;  
  23.     struct pollfd client[OPEN_MAX];  
  24.     struct sockaddr_in cliaddr, servaddr;  
  25.     int listenFd = socket(AF_INET, SOCK_STREAM, 0);  
  26.     if( listenFd < 0)  
  27.     {  
  28.         printf("socket函数执行失败");  
  29.         return 1;  
  30.     }  
  31.       
  32.     servaddr.sin_family = AF_INET;  
  33.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  34.     //inet_aton('10.132.10.64', &(servaddr.sin_addr));  
  35.     //servaddr.sin_addr.s_addr = inet_addr("10.132.10.64");  
  36.     servaddr.sin_port = htons(SERV_PORT);  
  37.     if(bind(listenFd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)  
  38.     {  
  39.         printf("bind函数执行失败");  
  40.         return 1;  
  41.     }  
  42.       
  43.     if(listen(listenFd, LISTENQ) < 0)  
  44.     {  
  45.             printf("listen函数执行失败");  
  46.         return 1;  
  47.     }  
  48.       
  49.     client[0].fd = listenFd;  
  50.     client[0].events = POLLRDNORM;  
  51.     for(int i =1; i < OPEN_MAX; i++)  
  52.     {  
  53.         client[i].fd = -1;  
  54.     }  
  55.     maxpoll = 0;  
  56.     printf("listen函数执行成功\n");  
  57.     while(true)  
  58.     {  
  59.       socklen_t clilen = sizeof(cliaddr);  
  60.         nreadly = poll(client, maxpoll + 1, 1000);  
  61.         if(client[0].revents & POLLRDNORM)  
  62.         {  
  63.              int idx = -1;  
  64.              for(int i =1; i < OPEN_MAX; i++)  
  65.              {  
  66.                     if(client[i].fd < 0)  
  67.                     {  
  68.                         idx = i;              
  69.                         break;  
  70.                     }  
  71.              }  
  72.              if(idx == -1)  
  73.              {  
  74.                     //丢弃连接  
  75.                     continue;  
  76.              }  
  77.              int connfd = accept(listenFd, (struct sockaddr*)&cliaddr, &clilen);  
  78.              if(connfd < 0)  
  79.              {  
  80.                     printf("accept函数执行失败");  
  81.                     break;  
  82.              }  
  83.              printf("Ip: %s 到此一游\n", inet_ntoa(cliaddr.sin_addr));  
  84.              client[idx].fd = connfd;  
  85.              client[idx].events = POLLRDNORM;  
  86.                
  87.              maxpoll = (idx > maxpoll ? idx : maxpoll);  
  88.                
  89.              if(--nreadly <= 0)  
  90.              {  
  91.                     continue;  
  92.              }  
  93.         }  
  94.       
  95.         for(int i =1; i < OPEN_MAX; i++)  
  96.         {  
  97.             int sockfd = client[i].fd;  
  98.             if(sockfd < 0)  
  99.             {  
  100.                     continue;  
  101.             }  
  102.             if(client[i].revents & (POLLRDNORM | POLLERR))  
  103.             {  
  104.                 char line[MAX_LINE];  
  105.                 int n = read(sockfd, line, sizeof(line));  
  106.                 if(n < 0)  
  107.                 {  
  108.                     if(errno == ECONNRESET)  
  109.                     {  
  110.                         close(sockfd);  
  111.                         client[i].fd = -1;  
  112.                         printf("异常退出\n");  
  113.                     }  
  114.                     else  
  115.                     {  
  116.                             printf("网络异常");  
  117.                             exit(-1);  
  118.                     }  
  119.                 }  
  120.                 else if(n == 0)  
  121.                 {  
  122.                     close(sockfd);  
  123.                     client[i].fd = -1;  
  124.                     printf("正常退出\n");  
  125.                 }  
  126.                 else  
  127.                 {  
  128.                     line[n] = 0;  
  129.                     printf("接收到数据:%s\n", line);  
  130.                     write(sockfd, line, n);  
  131.                 }  
  132.                 if(--nreadly <= 0)  
  133.               {  
  134.                     continue;  
  135.               }       
  136.             }  
  137.         }  
  138.     }  
  139. }  
原创粉丝点击