IO复用

xiaoxiao2021-02-28  101

轮询机制

1.select()系统调用FD_ZERO();FD_ISSET();FD_SET();FD_CLR();四个函数

返回值:-1出错;0 超时;其他:正常;

 #include"../utili.h"   2 #include<sys/select.h>   3   4 #define MAX_CLIENT_SIZE 5   5 int main()   6 {   7     int sockSer = startup(SERVER_IP,SERVER_PORT);   8     int client_fd[MAX_CLIENT_SIZE] = {0};   9     fd_set readset;  10     int max_sock = sockSer;  11     int conn_num = 0;  12     int i = 0;  13     int res;  14  15     char buffer[MAX_BUFFER_SIZE];  16     struct timeval tv;  17     for(;;)  18     {  19         FD_ZERO(&readset);  20         FD_SET(sockSer,&readset);  21  22         for(i=0; i<MAX_CLIENT_SIZE; ++i)  23         {  24             if(client_fd[i] != 0)  25             {  26                 FD_SET(client_fd[i],&readset);  27             }  28         }  29  30         tv.tv_sec = 5;  31         tv.tv_usec = 0;  32  33         res = select(max_sock+1,&readset,NULL,NULL,&tv);  34         if(res == -1)  35         {  36             perror("select");  37             continue;  38         }  39         else if(res == 0) 40         {  41             printf("server time out.\n");  42             continue;  43         }  44         else  45         {  46             for(i=0; i<conn_num; ++i)  47             {  48                 if(FD_ISSET((client_fd[i]),&readset))  49                 {  50                     recv(client_fd[i],buffer,MAX_BUFFER_SIZE,0);  51                     printf("From Client Msg:>%s\n",buffer);  52                     send(client_fd[i],buffer,strlen(buffer)+1,0);  53                 }  54             }  55             if(FD_ISSET(sockSer,&readset))  56             {  57                 struct sockaddr_in addrCli;  58                 socklen_t len = sizeof(struct sockaddr);  59                 int sockConn = accept(sockSer,(struct sockaddr*)&addrCli,&len);  60                 if(sockConn == -1)  61                 {  62                     perror("accept");  63                     continue;  64                 }  65                 if(conn_num < MAX_CLIENT_SIZE)  66                 {  67                     client_fd[conn_num++] = sockConn;  68                     if(sockConn > max_sock)  69                         max_sock = sockConn;  70                 }  71                 else  72                 {  73                     char *msg = "Sorry,Server OverLoaded.\n";  74                     send(sockConn,msg,strlen(msg)+1,0); 75                 }  76             }  77         }  78     }  79     close(sockSer);  80     return 0;  81 } 2.poll() struct pollfd结构体

 1 #include"../utili.h"   2 #include<poll.h>   3   4 #define MAX_CLIENT_SIZE 5   5 void do_poll(int sock);   6   7 int main()   8 {   9     int sockSer = startup(SERVER_IP,SERVER_PORT);  10     do_poll(sockSer);  11     close(sockSer);  12     return 0;  13 }  14  15 void do_poll(int sock)  16 {  17     struct pollfd client_fd[MAX_CLIENT_SIZE];  18     client_fd[0].fd = sock;  19     client_fd[1].events = POLLIN;  20  21     int i;  22     for(i=1; i<MAX_CLIENT_SIZE; ++i)  23         client_fd[i].fd = 0;  24  25     int num = 1;  26     int nready = 0;  27     char buffer[MAX_BUFFER_SIZE];  28     struct timeval tv;  29     for(;;)  30     {  31         tv.tv_sec = 5;  32         tv.tv_usec = 0;  33         nready = poll(client_fd,num,-1);  34         if(nready == -1)  35         {  36             perror("poll");  37             continue;  38         }  39         else if(nready == 0)  40         { 41             printf("server time out.\n");  42             continue;  43         }  44         else  45         {  46             if(client_fd[0].revents & POLLIN)  47             {  48                 struct sockaddr_in addrCli;  49                 socklen_t len = sizeof(struct sockaddr);  50                 int sockConn = accept(sock,(struct sockaddr*)&addrCli,&len);  51  52                 if(sockConn == -1)  53                 {  54                     perror("accept");  55                     continue;  56                 }  57                 for(i=1; i<MAX_CLIENT_SIZE; ++i)  58                 {  59                     if(client_fd[i].fd == 0)  60                     {  61                         client_fd[i].fd = sockConn;  62                         client_fd[i].events = POLLIN;  63                         num++;  64                         break;  65                     }  66                 }  67                 if(i == MAX_CLIENT_SIZE)  68                 {  69                     char *msg = "POLL:Sorry,Server OverLoad.";  70                     send(sockConn,msg,strlen(msg)+1,0);  71                 }  72                 continue;  73             }  74             for(i=1; i<MAX_CLIENT_SIZE; ++i)  75             {  76                 if(client_fd[i].fd == 0)  77                     continue;  78                 if(client_fd[i].revents & POLLIN) 79                 {  80                     recv(client_fd[i].fd,buffer,MAX_BUFFER_SIZE,0);  81                     printf("From Client Msg:>%s\n",buffer);  82                     send(client_fd[i].fd,buffer,strlen(buffer)+1,0);  83                 }  84  85             }  86         }  87     }  88 } 3.epoll()Linux特有的epoll_create() epoll_ctl() epoll_wait()

 1 #include"../utili.h"   2 #include<sys/epoll.h>   3   4 #define MAX_EVENT_SIZE 1024   5 #define MAX_CLIENT_SIZE 5   6   7 void do_epoll(int sock);   8 int main()   9 {  10     int sockSer = startup(SERVER_IP,SERVER_PORT);  11     do_epoll(sockSer);  12     close(sockSer);  13     return 0;  14 }  15  16 void add_event(int epoll_fd,int fd,int state)  17 {  18     struct epoll_event ev;  19     ev.events = state;  20     ev.data.fd = fd;  21     epoll_ctl(epoll_fd,EPOLL_CTL_ADD,fd,&ev);  22 }  23  24 void do_epoll(int sock)  25 {  26     struct epoll_event event[MAX_EVENT_SIZE];  27     int epoll_fd = epoll_create(MAX_CLIENT_SIZE);  28     add_event(epoll_fd,sock,EPOLLIN);  29  30     int ret;  31     int i;  32     for(;;)  33     {  34         ret = epoll_wait(epoll_fd,event,MAX_EVENT_SIZE,-1);  35         if(ret == -1)  36         {  37             perror("epoll_wait");  38             continue;  39         }  40         else

41         {  42             for(i=0; i<ret; ++i)  43             {  44                 if(event[i].data.fd == sock && event[i].events &&EPOLLIN)  45                 {  46                     struct sockaddr_in addrCli;  47                     socklen_t len = sizeof(struct sockaddr);  48                     int sockConn = accept(sock,(struct sockaddr*)&addrCli,&len);  49                     if(sockConn ==-1)  50                     {  51                         perror("accept");  52                         break;  53                     }  54                     add_event(epoll_fd,sockConn,EPOLLIN);  55                 }  56                 else if(event[i].events & EPOLLIN)  57                 {  58                     char buffer[MAX_BUFFER_SIZE];  59                     recv(event[i].data.fd,buffer,MAX_BUFFER_SIZE,0);  60                     printf("msg:>%s\n",buffer);  61                     send(event[i].data.fd,buffer,strlen(buffer)+1,0);  62                 }  63             }  64         }  65     }  66 }

转载请注明原文地址: https://www.6miu.com/read-56578.html

最新回复(0)