客服端-服务器(B/S)模式的简单通信

任务描述:服务器端将客户端请求的字符串进行小写->大写转换,并响应给客户端。

服务端:(为了突出逻辑表示,未做函数返回值处理)

  #include <iostream>
  #include <arpa/inet.h>
  #include <ctype.h>
  #include <unistd.h>
  #include <cstdlib>
  #include <cstdio>
  using namespace std;
  #define PORT 10088  // 通信端口
 
  int main()
  {
      int s_fd = socket(AF_INET, SOCK_STREAM, 0); // 建立服务端套接字,返回服务器端的套接字描述符
  	// AF_INET:IPv4通信协议, SOCK_STREAM:TCP连接
      struct sockaddr_in s_addr;   // 描述ip地址信息的结构体
      s_addr.sin_family = AF_INET;  // 采用的协议族
      s_addr.sin_port = htons(PORT); // 端口号
      s_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip地址;htonl将本地的小端存储格式更改为网络字节序(大端存储格式)。 INADDR_ANY:选用本机可用地址
  	
      bind(s_fd, (struct sockaddr *)&s_addr, sizeof(s_addr)); // 绑定套接字、IP地址和端口
      listen(s_fd, 128); // 最大等待连接数
  
      sockaddr_in c_addr; 
      char buf[BUFSIZ]; // 内容缓冲区
  
      socklen_t len = 0;
 		// 建立与客户端的链接,返回客户端的套接字描述符,阻塞等待连接
      int c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &len);
  
      char ip_buf[33];
      char ip_addr[BUFSIZ];
 		// 打印连接的客户端的ip地址与端口
      inet_ntop(AF_INET, &c_addr.sin_addr.s_addr, ip_buf, sizeof(ip_buf));
      cout << "client ip:" << ip_buf << endl;  //ntohl(c_addr.sin_addr.s_addr) << endl;
      cout << "client port: " << ntohs(c_addr.sin_port) << endl;                                           
      while(true)
      {
 			// 读取客户端的请求内容,返回字节大小
          int n = read(c_fd, buf, sizeof(buf));
 			// 对字节进行小写->大写的转换
          for(int i=0; i<n; i++)
              buf[i] = toupper(buf[i]);
     		// 通过客户端套接字写回客户端
          write(c_fd, buf, n);
      }
 		// 关闭套接字描述符
      close(c_fd);
      close(s_fd);
      return 0;
  }
~                               

客户端:客户端的原理与服务端基本差不多,具体代码如下

   #include <iostream>
   #include <string>
   #include <cstdio>
   #include <cstring>
   #include <unistd.h>
   #include <arpa/inet.h>
   using namespace std;
   
   #define SERV_IP "127.0.0.1"
   #define SERV_PORT 10088 
  
   int main()
  {
  
      int cfd = socket(AF_INET, SOCK_STREAM, 0);
  
      sockaddr_in serv_addr;
      memset(&serv_addr, 0, sizeof(serv_addr)); // 初始化
  
      serv_addr.sin_family = AF_INET;
      serv_addr.sin_port = htons(SERV_PORT);
      inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);
  	// 建立与服务器端的链接
      connect(cfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
      
      char buf[BUFSIZ];
  
      while(true)
      {
          fgets(buf, sizeof(buf), stdin);
          write(cfd, buf, strlen(buf));
          int len = read(cfd, buf, sizeof(buf));
          write(STDOUT_FILENO, buf, len);
      }
      close(cfd);
      
      return 0;                                                                                                            
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值