步骤1:同上
步骤2:建立目录
cd workdir/linux/application/12-network/
mkdir select
cd select/
步骤3:复制
cp /mnt/hgfs/share/2.\ Linux系统部分/19.\ Linux系统select\ IO复用实验/实验代码/selectecho/client.c ./ -a
cp /mnt/hgfs/share/2.\ Linux系统部分/19.\ Linux系统select\ IO复用实验/实验代码/selectecho/server.c ./ -a
步骤4:执行
gcc server.c -o server
gcc client.c -o client
./server 192.168.100.192 8888
新打开终端
./client 192.168.100.192 8888

附:程序源码
client.c
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <sys/types.h> 6 #include <sys/socket.h> 7 #include <errno.h> 8 #include <strings.h> 9 #include <netinet/in.h> 10 #include <arpa/inet.h> 11 12 typedef struct sockaddr SA; 13 #define N 64 14 15 int main(int argc, char *argv[]) 16 { 17 int sockfd; 18 ssize_t n; 19 struct sockaddr_in servaddr; 20 char buf[N] = {0}; 21 22 if (argc < 3) 23 { 24 fprintf(stdout, "usage:%s ip port\n", argv[0]); 25 exit(0); 26 } 27 28 if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) 29 { 30 perror("socket"); 31 exit(-1); 32 } 33 34 bzero(&servaddr, sizeof(servaddr)); 35 servaddr.sin_family = PF_INET; 36 servaddr.sin_port = htons(atoi(argv[2]));// "9000"---9000 37 servaddr.sin_addr.s_addr = inet_addr(argv[1]); 38 39 if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr)) == -1) 40 { 41 perror("connect"); 42 exit(-1); 43 } 44 45 printf(">"); 46 while (fgets(buf, N, stdin) != NULL)//abc\n 47 { 48 buf[strlen(buf)-1] = 0;//abc\0 49 send(sockfd, buf, N, 0); 50 51 bzero(buf, sizeof(buf)); 52 n = recv(sockfd, buf, N, 0); 53 printf("n=%d buf=%s\n", n, buf); 54 printf(">"); 55 } 56 57 close(sockfd); 58 59 exit(0); 60 }
server.c
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <sys/types.h> /* See NOTES */ 5 #include <sys/time.h> 6 #include <unistd.h> 7 #include <sys/select.h> 8 #include <sys/socket.h> 9 #include <errno.h> 10 #include <strings.h> 11 #include <netinet/in.h> 12 #include <arpa/inet.h> 13 14 #define N 64 15 typedef struct sockaddr SA; 16 17 int main(int argc, char *argv[]) 18 { 19 int listenfd, connfd, maxfd, i; 20 struct sockaddr_in servaddr, peeraddr; 21 socklen_t len; 22 char buf[N] = {0}; 23 fd_set rdfs, bakrdfs; 24 ssize_t n; 25 26 if (argc < 3) 27 { 28 fprintf(stdout, "usage:%s <ip> <port>\n", argv[0]); 29 exit(0); 30 } 31 32 bzero(&servaddr, sizeof(servaddr)); 33 34 if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) 35 { 36 perror("socket"); 37 exit(-1); 38 } 39 40 servaddr.sin_family = PF_INET; 41 servaddr.sin_port = htons(atoi(argv[2])); 42 servaddr.sin_addr.s_addr = inet_addr(argv[1]); 43 44 if (bind(listenfd, (SA *)&servaddr, sizeof(servaddr)) == -1) 45 { 46 perror("bind"); 47 exit(-1); 48 } 49 50 listen(listenfd, 5); 51 maxfd = listenfd; 52 53 FD_ZERO(&bakrdfs); 54 FD_SET(listenfd, &bakrdfs); 55 56 len = sizeof(peeraddr); 57 while (1) 58 { 59 rdfs = bakrdfs; 60 61 if (select(maxfd+1, &rdfs, NULL, NULL, NULL) == -1) 62 { 63 perror("select"); 64 exit(-1); 65 } 66 67 for (i = 0; i <= maxfd; i++) 68 { 69 if (FD_ISSET(i, &rdfs)) 70 { 71 if (i == listenfd) 72 { 73 if ((connfd = accept(i, (SA *)&peeraddr, &len)) == -1) 74 { 75 perror("accept"); 76 exit(-1); 77 } 78 fprintf(stdout, "welcome %s %d\n", 79 inet_ntoa(peeraddr.sin_addr), 80 ntohs(peeraddr.sin_port)); 81 82 FD_SET(connfd, &bakrdfs); 83 maxfd = (maxfd > connfd) ? maxfd : connfd; 84 } 85 else 86 { 87 bzero(buf, sizeof(buf)); 88 if ((n = recv(i, buf, N, 0)) == 0) 89 { 90 close(i); 91 FD_CLR(i, &bakrdfs); 92 } 93 else 94 { 95 printf("n=%d %s\n", n, buf); 96 send(i, buf, N, 0); 97 } 98 } 99 } 100 } 101 } 102 103 exit(0); 104 }
浙公网安备 33010602011771号