网络编程作业

第二次作业

服务器端:

View Code
  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  }

客户端:

View Code
 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    

 

转载于:https://www.cnblogs.com/efinger/archive/2013/04/15/3023248.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值