国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

select服務器簡單實現

2019-11-08 19:59:34
字體:
來源:轉載
供稿:網友

一.服務器代碼

  1 #include <stdio.h>  2 #include <stdlib.h>  3 #include <string.h>  4 #include <netinet/in.h>  5 #include <arpa/inet.h>  6   7 #define MAXLINE 80  8 #define SERV_PORT 6666  9  10 int main() 11 { 12     struct sockaddr_in cliaddr, servaddr; 13     int i, maxi, maxfd, listenfd, connfd, sockfd; 14     int nready, client[FD_SETSIZE]; 15     ssize_t n; 16     fd_set rset, allset; 17     char buf[MAXLINE]; 18     char str[INET_ADDRSTRLEN]; 19     socklen_t cliaddr_len; 20  21     listenfd = socket(AF_INET, SOCK_STREAM, 0); 22  23     bzero(&servaddr, sizeof(servaddr)); 24     servaddr.sin_family = AF_INET; 25     servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 26     servaddr.sin_port = htons(SERV_PORT); 27  28     bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); 29  30     listen(listenfd, 20); 31  32     maxfd = listenfd; 33     maxi = -1; 34  35     for(i = 0; i < FD_SETSIZE; i++) 36     { 37         client[i] = -1; 38     } 39     FD_ZERO(&allset); 40     FD_SET(listenfd, &allset); 41  42     while(1) 43     { 44         rset = allset; 45         nready = select(maxfd + 1, &rset, NULL, NULL, NULL); 46  47         if(nready < 0) 48         { 49             PRintf("select error!/n"); 50         } 51         if(FD_ISSET(listenfd, &rset)) 52         { 53             cliaddr_len = sizeof(cliaddr); 54             connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &cliaddr_len); 55             printf("received from %s at port %d/n", 56                             inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), 57                             ntohs(cliaddr.sin_port)); 58             for(i = 0; i < FD_SETSIZE; i++) 59             { 60                 if(client[i] < 0) 61                 { 62                     client[i] = connfd; 63                     break; 64                 } 65             } 66            if(i == FD_SETSIZE) 67            { 68                 fputs("too many clients/n", stderr); 69                 exit(1); 70            } 71  72            FD_SET(connfd, &allset); 73            if(connfd > maxfd) 74            { 75                 maxfd = connfd; 76            } 77            if(i > maxi) 78            { 79                 maxi = i; 80            } 81            if(--nready == 0) 82            { 83                 continue; 84            } 85         } 86         for(i = 0; i <= maxi; i++) 87         { 88             if((sockfd = client[i]) < 0) 89             { 90                 continue; 91             } 92             if(FD_ISSET(sockfd, &rset)) 93             { 94                 if((n = read(sockfd, buf, MAXLINE)) == 0) 95                 { 96                     close(sockfd); 97                     FD_CLR(sockfd, &allset); 98                     client[i] = -1; 99                 }100                 else101                 {102                     int j;103                     for(j = 0; j < n; j++)104                     {105                         buf[j] = toupper(buf[j]);106                     }107                     write(sockfd, buf, n);108                 }109                 if(--nready == 0)110                 {111                     break;112                 }113             }114         }115     }116     close(listenfd);117     return 0;118 }

二.客戶端代碼

 #include <stdio.h>  2 #include <stdlib.h>  3 #include <string.h>  4 #include <unistd.h>  5 #include <netinet/in.h>  6   7   8 #define MAXLINE 80  9 #define ip "127.0.0.1" 10 #define SERV_PORT 6666 11  12 int main(int argc, char* argv[]) 13 { 14     struct sockaddr_in servaddr; 15     char buf[MAXLINE]; 16     int sockfd, n; 17      18     sockfd = socket(AF_INET, SOCK_STREAM, 0); 19      20     bzero(&servaddr, sizeof(servaddr)); 21     servaddr.sin_family = AF_INET; 22     inet_pton(AF_INET, IP, &servaddr.sin_addr); 23     servaddr.sin_port = htons(SERV_PORT); 24      25     connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); 26      27     while(fgets(buf, MAXLINE, stdin) != NULL) 28     { 29         write(sockfd, buf, strlen(buf)); 30         n = read(sockfd, buf, MAXLINE); 31         if(n == 0) 32         { 33             printf("the other side has been closed./n"); 34         } 35         else 36         { 37             write(STDOUT_FILENO, buf, n); 38         } 39     } 40     close(sockfd); 41     return 0; 42 }~     


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 理塘县| 滁州市| 新竹市| 汉沽区| 毕节市| 新宾| 湘西| 报价| 赞皇县| 毕节市| 汤阴县| 余姚市| 法库县| 璧山县| 池州市| 军事| 博罗县| 滨州市| 穆棱市| 西乌| 肇庆市| 牙克石市| 武清区| 平舆县| 于田县| 淮安市| 广元市| 阳曲县| 长垣县| 仙桃市| 望谟县| 綦江县| 灌阳县| 剑川县| 富川| 扶绥县| 湖南省| 正镶白旗| 吉木萨尔县| 武清区| 兴宁市|