第二次作业
服务器端:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 View Code 2 /* 3 * 服务器端程序: 4 * 接收客户的连接,并显示客户的IP 地址和端口号; 5 * 接收客户端传来的字符串并反转后返回; 6 * */ 7 #include <stdio.h> 8 #include <stdlib.h> 9 #include <string.h> 10 #include <unistd.h> 11 #include <sys/types.h> 12 #include <sys/socket.h> 13 #include <netinet/in.h> 14 #include <arpa/inet.h> 15 16 #define PORT 3555 17 /* listen 函数中的backlog的含义从未正式定义过; 18 * 内核为此套节字排队的最大已完成连接个数 19 * 不要把backlog定义为0 */ 20 #define BACKLOG 1 21 #define MAXDATASIZE 100 22 23 void process_cli(int connfd, struct sockaddr_in client); 24 char* revstr(char *str, size_t len); 25 26 int 27 main(void) 28 { 29 int listenfd,connfd; 30 int sin_size; 31 struct sockaddr_in server,client; 32 33 if( (listenfd=socket(AF_INET, SOCK_STREAM, 0) )==-1 ) 34 { 35 perror("Create socket failed."); 36 exit(-1); 37 } 38 /* bind 返回常见错误之一:EADDRINUSE,设置套接口选项 SO_REUSEADDR, 便于调试 */ 39 int opt = SO_REUSEADDR; 40 setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); 41 42 bzero(&server, sizeof(server)); 43 server.sin_family = AF_INET; 44 server.sin_port = htons(PORT); 45 server.sin_addr.s_addr = htonl(INADDR_ANY); 46 if( bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr))== -1 ){ 47 perror("Bind error."); 48 exit(-1); 49 } 50 51 if( listen(listenfd, BACKLOG)==-1 ){ 52 perror("listen error"); 53 exit(-1); 54 } 55 56 sin_size = sizeof(struct sockaddr_in); 57 58 if( (connfd = accept(listenfd, (struct sockaddr*)&client, &sin_size)) == -1 ){ 59 perror("Accept error."); 60 exit(-1); 61 } 62 63 /* 打印连接信息 */ 64 printf("\nA new connection from:\n"); 65 printf(" IP : %s\n PORT:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); 66 /* 处理客户端请求业务 */ 67 process_cli(connfd, client); 68 69 close(connfd); 70 /* close(listenfd); */ 71 72 return 0; 73 } 74 75 /* Process client*/ 76 void process_cli(int connfd, struct sockaddr_in client){ 77 78 int numbytes; 79 char welcom[50] = "welcom to connect my server."; 80 char rcvbuf[MAXDATASIZE]; 81 char * output; 82 send(connfd, welcom, strlen(welcom), 0); 83 84 for( ; ; ){ 85 if( ((numbytes = recv(connfd, rcvbuf, MAXDATASIZE, 0)) == -1) ) { 86 perror("recv error."); 87 exit(1); 88 } 89 rcvbuf[numbytes] = '\0'; 90 printf("<Message from client:>\n%s\n\n", rcvbuf); 91 92 output = revstr(rcvbuf, numbytes); 93 send(connfd, rcvbuf, sizeof(rcvbuf), 0); 94 95 }/*end for(;;)*/ 96 97 } 98 99 /*String Reverse*/ 100 char* revstr(char *str, size_t len){ 101 char *start = str; 102 char *end = str + len - 1; 103 char ch; 104 105 if(str != NULL){ 106 while (start < end){ 107 ch = *start; 108 *start++ = *end; 109 *end-- = ch; 110 } 111 } 112 113 return str; 114 }
客户端:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 /***************************************************************** 2 * 客户端程序: 3 * 从命令行读入服务器的IP地址并连接到服务器; 4 * 循环从命令行读入一行字符串,并传递给服务器,由 5 * 服务器对字符串进行反转,客户端显示翻转之后的字符串。 6 *****************************************************************/ 7 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <string.h> 11 #include <unistd.h> 12 #include <sys/socket.h> 13 #include <netinet/in.h> 14 #include <netdb.h> 15 16 #define PORT 3555 17 #define MAXDATASIZE 100 18 19 int 20 main(int argc, char *argv[]) 21 { 22 int fd, numbytes; 23 char buf[MAXDATASIZE]; 24 char rcvbuf[MAXDATASIZE]; 25 struct hostent *hst; 26 struct sockaddr_in server; 27 if ( argc != 2) { 28 printf("Usage: %s <IP address>\n", argv[0]); 29 exit(-1); 30 } 31 32 if ( (hst = gethostbyname(argv[1])) == NULL) { 33 perror("gethostbyname error."); 34 exit(1); 35 } 36 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 37 perror("Create socket failed."); 38 exit(1); 39 } 40 41 bzero(&server, sizeof(server)); 42 server.sin_family = AF_INET; 43 server.sin_port = htons(PORT); 44 server.sin_addr = *((struct in_addr *) hst->h_addr); 45 46 if (connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) { 47 perror("connect failed."); 48 exit(1); 49 } 50 51 if( ((numbytes = recv(fd, rcvbuf, MAXDATASIZE, 0)) == -1) ) { 52 perror("recv error."); 53 exit(1); 54 } 55 rcvbuf[numbytes] = '\0'; 56 printf("%s\n",rcvbuf); 57 for( ; ; ){ 58 printf("Please input a string(length < 100):\n"); 59 gets(buf); 60 if(strlen(buf) != 0){ 61 62 send(fd, buf, strlen(buf), 0); 63 if( ((numbytes = recv(fd, rcvbuf, MAXDATASIZE, 0)) == -1) ) { 64 perror("recv error."); 65 exit(1); 66 } 67 rcvbuf[numbytes] = '\0'; 68 if(numbytes != 0) 69 printf("<Reverse string from server:>\n%s\n\n",rcvbuf); 70 } 71 } 72 73 close(fd); 74 75 return 0; 76 } 77