首页 > 学院 > 开发设计 > 正文

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 }~     


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表