首页主机资讯CentOS C++网络通信协议

CentOS C++网络通信协议

时间2026-01-21 00:50:03发布访客分类主机资讯浏览1088
导读:CentOS 下 C++ 网络通信协议实践指南 一 常用协议与适用场景 TCP:面向连接、可靠传输、字节流,适合对数据完整性要求高的业务(如RPC、文件传输、数据库协议)。 UDP:无连接、尽最大努力交付、低时延,适合实时音视频、游戏、监...

CentOS 下 C++ 网络通信协议实践指南

一 常用协议与适用场景

  • TCP:面向连接、可靠传输、字节流,适合对数据完整性要求高的业务(如RPC、文件传输、数据库协议)。
  • UDP:无连接、尽最大努力交付、低时延,适合实时音视频、游戏、监控等;需自行处理顺序、丢包、重传
  • HTTP/HTTPS:应用层协议,生态成熟;可用 libcurl(客户端)或 cpp-httplib / POCO(服务端)快速实现 RESTful API
  • RPC 框架:如 gRPC(基于 HTTP/2Protobuf),适合微服务与跨语言通信。
  • 常用库Boost.Asio / Asio(跨平台异步 I/O)、libevent / libev(事件驱动)、POCO(HTTP/FTP/SMTP 等)、libcurl(多协议客户端)。

二 环境准备与依赖安装

  • 安装编译与网络开发工具:
    • 命令:sudo yum groupinstall "Development Tools" -y
    • 命令:sudo yum install -y gcc-c++ openssl-devel boost-devel
  • 可选依赖(按需):
    • libevent / libev:事件驱动网络;POCO:HTTP/HTTPS、FTP、SMTP 等;libcurl:HTTP/HTTPS/FTP 等客户端;gRPC/Protobuf:RPC 与强类型序列化。

三 极简 TCP 与 UDP 示例

  • TCP 服务端(回显,端口 8080
    • 要点:socket(AF_INET, SOCK_STREAM, 0)setsockopt(SO_REUSEADDR|SO_REUSEPORT)bindlistenacceptread/sendclose
    • 代码片段:
      int server_fd = socket(AF_INET, SOCK_STREAM, 0);
          
      int opt = 1;
           setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &
          opt, sizeof(opt));
      
      struct sockaddr_in addr{
      }
          ;
          
      addr.sin_family = AF_INET;
           addr.sin_addr.s_addr = INADDR_ANY;
           addr.sin_port = htons(8080);
          
      bind(server_fd, (struct sockaddr*)&
          addr, sizeof(addr));
          
      listen(server_fd, 128);
          
      int fd = accept(server_fd, nullptr, nullptr);
          
      char buf[1024];
           ssize_t n = read(fd, buf, sizeof(buf)-1);
          
      write(fd, buf, n);
           close(fd);
           close(server_fd);
          
      
  • TCP 客户端
    • 要点:socketconnectsend/recvclose
    • 代码片段:
      int sock = socket(AF_INET, SOCK_STREAM, 0);
      
      struct sockaddr_in serv{
      }
          ;
          
      serv.sin_family = AF_INET;
           serv.sin_port = htons(8080);
          
      inet_pton(AF_INET, "127.0.0.1", &
          serv.sin_addr);
          
      connect(sock, (struct sockaddr*)&
          serv, sizeof(serv));
          
      write(sock, "Hello", 5);
          
      char buf[1024];
           read(sock, buf, sizeof(buf)-1);
           close(sock);
          
      
  • UDP 回显(端口 9000
    • 要点:socket(AF_INET, SOCK_DGRAM, 0)bindrecvfrom/sendto
    • 代码片段:
      int sock = socket(AF_INET, SOCK_DGRAM, 0);
      
      struct sockaddr_in addr{
      }
          ;
          
      addr.sin_family = AF_INET;
           addr.sin_addr.s_addr = INADDR_ANY;
           addr.sin_port = htons(9000);
          
      bind(sock, (struct sockaddr*)&
          addr, sizeof(addr));
          
      char buf[65536];
       struct sockaddr_in cli{
      }
          ;
           socklen_t len = sizeof(cli);
          
      ssize_t n = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr*)&
          cli, &
          len);
          
      sendto(sock, buf, n, 0, (struct sockaddr*)&
          cli, len);
           close(sock);
          
      
  • 编译运行
    • 命令:g++ -std=c++11 server_tcp.cpp -o server_tcp & & ./server_tcp
    • 命令:g++ -std=c++11 client_tcp.cpp -o client_tcp & & ./client_tcp
    • 命令:g++ -std=c++11 server_udp.cpp -o server_udp & & ./server_udp
    • 命令:g++ -std=c++11 client_udp.cpp -o client_udp & & ./client_udp 127.0.0.1 9000

四 数据序列化与报文设计

  • 为什么需要序列化
    • 跨语言/跨平台兼容、避免结构体内存对齐/字节序差异、便于版本演进校验
  • 常见方案
    • Protobuf(强类型、体积小、IDL 定义、生态完善);JSON(可读性好、文本格式);MessagePack(二进制、高效);自定义TLV(Tag-Length-Value)二进制协议。
  • 报文设计要点
    • 固定Header(如:magic、version、cmd、body_len、checksum/timestamp),变长 Body(序列化后的业务数据)。
    • 粘包/半包处理:先读 Header 再按 body_lenBody;必要时加入长度字段分隔符策略。
    • 示例(概念):[4B magic][1B ver][2B cmd][4B body_len][2B checksum][N bytes body]
  • 实践参考
    • CentOS 7 上结合 ProtobufTCP Socket 的 C++ 示例工程,演示了 .proto 编译、序列化/反序列化与客户端/服务端交互。

五 性能与工程化建议

  • I/O 模型
    • 优先使用非阻塞 I/O + I/O 多路复用(如 epoll/kqueue)或异步 I/O;结合线程池/协程提升并发处理能力。
  • 并发与架构
    • Reactor/Proactor 模型;主从 Reactor;one loop per thread;连接与业务线程解耦。
  • 可靠性与可观测性
    • 心跳/超时/重连流量控制/拥塞控制背压日志、指标、链路追踪
  • 传输安全
    • 启用 TLS/SSL(如 OpenSSL);对外服务优先 HTTPS/WSS;对内服务按需启用 mTLS
  • 常用库选型
    • 高并发异步:Boost.Asio / Asio、libevent/libev;HTTP 服务:POCO、cpp-httplib;多协议客户端:libcurl;RPC:gRPC/Protobuf

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: CentOS C++网络通信协议
本文地址: https://pptw.com/jishu/787880.html
CentOS中C++ STL使用指南 CentOS下C++异常处理方法

游客 回复需填写必要信息