• 并发服务器(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 }
  • 相关阅读:
    使用HttpClient发送请求、接收响应
    jdbc操作
    数据库通用Jdbc操作
    将WSDL文件生成的Java文件
    数据结构_线性表_链表实现
    15年第六届蓝桥杯第七题_手链样式_(stl_string)
    16年第七届蓝桥杯第九题_密码脱落_(贪心)
    16年第七届蓝桥杯第七题_剪邮票
    16年第七届蓝桥杯第三题_方格填数
    Codeforces_789C_(dp)
  • 原文地址:https://www.cnblogs.com/coversky/p/7856926.html
Copyright © 2020-2023  润新知