# protobuf_cpp_test **Repository Path**: wanggang2020/protobuf_cpp_test ## Basic Information - **Project Name**: protobuf_cpp_test - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-08 - **Last Updated**: 2026-05-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Protobuf C++11 网络通信示例项目 这是一个使用 C++11 和 proto3 语法的 Google Protocol Buffers 网络通信示例项目,包含发送端和接收端两个独立程序,支持两台主机之间的数据传输。 ## 项目简介 本项目演示了如何使用 protobuf 进行数据序列化和反序列化,并通过 TCP/IP 网络在两台主机之间传输数据。 ## 功能特性 - 使用 proto3 语法定义消息结构 - C++11 标准实现发送和接收逻辑 - TCP/IP 网络通信(IPv4) - 支持跨主机数据传输 - 包含消息长度前缀,确保完整接收 - 支持嵌套消息和枚举类型 ## 文件结构 ``` protobuf_cpp_test/ ├── message.proto # proto3 消息定义文件 ├── message.pb.cc # protoc 生成的 C++ 源文件 ├── message.pb.h # protoc 生成的 C++ 头文件 ├── sender.cpp # 发送端程序 ├── receiver.cpp # 接收端程序 ├── Makefile # 编译脚本 └── README.md # 项目说明文档 ``` ## 文件说明 ### message.proto 定义了两个消息类型: - **Person**: 人员信息,包含姓名、ID、邮箱和电话号码列表 - **AddressBook**: 地址簿,包含多个 Person ### message.pb.cc / message.pb.h 由 protoc 编译器从 message.proto 自动生成的 C++ 代码,包含消息的序列化、反序列化和访问方法。 ### sender.cpp 发送端程序,功能包括: - 创建 AddressBook 消息 - 序列化为字节数组 - 建立 TCP 连接 - 发送数据长度和数据内容 ### receiver.cpp 接收端程序,功能包括: - 监听指定端口 - 接受客户端连接 - 接收数据长度和数据内容 - 反序列化为 AddressBook - 打印接收到的消息内容 ## 环境要求 - **编译器**: GCC 4.8+ 或支持 C++11 的编译器 - **Protobuf**: 3.x 或 4.x 版本 - **操作系统**: Linux(支持 POSIX socket API) ## 编译步骤 1. 确保已安装 protobuf 编译器和运行时库: ```bash # Ubuntu/Debian sudo apt-get install protobuf-compiler libprotobuf-dev # CentOS/RHEL sudo yum install protobuf-compiler protobuf-devel ``` 2. 使用 Makefile 编译: ```bash make ``` ## 运行程序 ### 单主机测试 **终端1 - 启动接收端:** ```bash ./receiver 8888 ``` **终端2 - 启动发送端:** ```bash ./sender 127.0.0.1 8888 ``` ### 跨主机测试 **接收端主机(假设 IP 为 192.168.1.100):** ```bash ./receiver 8888 ``` **发送端主机:** ```bash ./sender 192.168.1.100 8888 ``` ## 命令参数 ### receiver ``` Usage: receiver ``` - `listen_port`: 接收端监听的端口号 ### sender ``` Usage: sender ``` - `server_ip`: 接收端主机的 IP 地址 - `server_port`: 接收端监听的端口号 ## 预期输出 **接收端输出:** ``` === 启动接收端 === 正在监听端口 8888... 接收到来自 127.0.0.1:12345 的连接 === 接收数据 === 接收到数据大小: 114 字节 成功接收 114 字节数据 === 反序列化消息 === 反序列化成功! 接收的地址簿内容: Address Book contains 2 people: Person ID: 1 Name: 张三 Email: zhangsan@example.com Phone: 13812345678 (Mobile) Phone: 010-12345678 (Home) Person ID: 2 Name: 李四 Email: lisi@example.com Phone: 13987654321 (Work) === 接收完成 === ``` **发送端输出:** ``` === 创建地址簿 === 待发送的地址簿: Address Book contains 2 people: Person ID: 1 Name: 张三 Email: zhangsan@example.com Phone: 13812345678 (Mobile) Phone: 010-12345678 (Home) Person ID: 2 Name: 李四 Email: lisi@example.com Phone: 13987654321 (Work) === 序列化消息 === 序列化后的数据大小: 114 字节 === 连接到接收端 === 已连接到 127.0.0.1:8888 === 发送数据 === 成功发送 114 字节数据 === 发送完成 === ``` ## 清理编译产物 ```bash make clean ``` ## 技术要点 1. **序列化**: 使用 `SerializeToArray()` 将消息转换为字节数组 2. **反序列化**: 使用 `ParseFromArray()` 从字节数组恢复消息 3. **消息长度前缀**: 先发送数据长度(4字节),再发送数据内容 4. **字节序转换**: 使用 `htonl()`/`ntohl()` 处理网络字节序 5. **socket 编程**: 使用 POSIX socket API 实现 TCP 通信 6. **内存管理**: 使用 `unique_ptr` 进行智能指针管理 ## 注意事项 - 确保接收端先启动,再启动发送端 - 确保端口未被其他程序占用 - 跨主机通信时确保网络可达(防火墙允许) - 编译时需要链接 protobuf 和 pthread 库