并发服务器(IO多路复用)

 1 #include "apue.h"
 2 
 3 int main(int argc, char *argv[])
 4 {
 5     int i,maxi,maxfd,listenfd,connfd,sockfd;
 6     int nready,client[FD_SETSIZE];
 7     ssize_t n;
 8     fd_set rset,allset;
 9     char buf[maxlen];
10     socklen_t clilen;
11     struct sockaddr_in cliaddr,servaddr;
12     listenfd=socket(AF_INET,SOCK_STREAM,0);
13     bzero(&servaddr,sizeof(servaddr));
14     servaddr.sin_family=AF_INET;
15     servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
16     servaddr,sin_port=htons(8888);
17     bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
18     maxfd=listenfd;
19     listen(listenfd,10);
20     maxi=-1;
21     memset(client,sizeof(client),-1);
22     FD_ZERO(allset);
23     FD_SET(listenfd,&allset);
24 /**************************************************/
25     while(1)
26     {
27         rest=allset;
28         nready=select(maxfd+1,&rset,NULL,NULL,NULL);
29         if(FD_ISSET(listenfd,&rset))
30         {
31             clilen=sizeof(cliaddr);
32             connfd=accept(listenfd,(SA*)&cliaddr,&clilen);
33             for(i=0;i<FD_SETSIZE;i++)
34             {
35                 if(client[i]==-1)
36                 {
37                     client[i]=connfd;
38                 }
39             }
40             if(i==FD_SETSIZE){perror("too many client!")}
41             FD_SET(connfd,&allset);
42             if(connfd>maxfd){maxfd=connfd;}
43             if(i>maxi){maxi=i;}
44             if(--nready<=0)continue;//no more useable sockfd
45         }
46         for(i=0;i<maxi;i++)
47         {
48             if((sockfd=client[i])<0)
49             {
50                 continue;
51             }
52             if(FD_ISSET(sockfd,&rset))
53             {
54                 if((n=read(sockfd,buf,maxlen))==0)
55                 {
56                     close(sockfd);
57                     FD_CLR(sockfd,&allset);
58                     client[i]=-1;
59                 }else
60                 dowhatyouwant();
61                 if(--nready<=0)
62                 {
63                     break;
64                 }
65             }
66             
67         
68         }
69     
70     
71     }
72 
73 
74     
75     return 0;
76 }
原文地址:https://www.cnblogs.com/coversky/p/7856926.html