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 }~
新闻热点
疑难解答