一、编译安装
1. 下载 protobuf 源代码: 前往 protobuf GitHub 仓库 或 protobuf Releases 下载最新的源代码压缩包。
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.2/protobuf-all-3.19.2.tar.gz
2. 解压源代码:
tar -xzvf protobuf-all-3.19.2.tar.gz
3. 进入 protobuf 目录:
cd protobuf-3.19.2
4. 配置和编译:
./configure
make
如果系统没有安装 autoconf 和 automake,需要先安装它们。
5. 安装 protobuf:
make install
6. 更新动态链接库缓存:
ldconfig
7. 验证安装:
运行以下命令验证 protobuf 是否成功安装:
protoc --version
二、使用
步骤 1: 定义 protobuf 消息
新建名为 message.proto 的 protobuf 文件:
protoCopy code
syntax = "proto3";
message Student {
int32 id = 1;
string name = 2;
string email = 3;
}
步骤 2: 生成 C++ 代码
使用 protoc 工具生成 C++ 代码:
protoc message.proto --cpp_out=./
这将生成 message.pb.h 和 message.pb.cc 文件,其中包含了 protobuf 消息的 C++ 定义和实现。
步骤 3: 编写服务器和客户端代码
服务器端 (server.cpp)
#include <iostream>
#include <string>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include "message.pb.h"
#define PORT 8080
int main() {
// 创建 socket
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
// 绑定 socket
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = INADDR_ANY;
bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
// 监听
listen(serverSocket, 5);
std::cout << "Server listening on port " << PORT << std::endl;
// 接受连接
int clientSocket = accept(serverSocket, nullptr, nullptr);
std::cout << "Client connected" << std::endl;
// 接收消息
Student receivedStudent;
char buffer[1024];
recv(clientSocket, buffer, sizeof(buffer), 0);
receivedStudent.ParseFromArray(buffer, sizeof(buffer));
// 打印接收到的消息
std::cout << "Received Student ID: " << receivedStudent.id() << std::endl;
std::cout << "Received Student Name: " << receivedStudent.name() << std::endl;
std::cout << "Received Student Email: " << receivedStudent.email() << std::endl;
// 关闭连接
close(clientSocket);
close(serverSocket);
return 0;
}
客户端 (client.cpp)
#include <iostream>
#include <string>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include "message.pb.h"
#define PORT 8080
int main() {
// 创建 socket
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
// 连接到服务器
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = INADDR_ANY;
connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
std::cout << "Connected to server" << std::endl;
// 创建 Student 消息
Student student;
student.set_id(123);
student.set_name("John Doe");
student.set_email("john.doe@example.com");
// 发送消息
char buffer[1024];
student.SerializeToArray(buffer, sizeof(buffer));
send(clientSocket, buffer, sizeof(buffer), 0);
std::cout << "Student message sent" << std::endl;
// 关闭连接
close(clientSocket);
return 0;
}
步骤 4: 编译和运行
编译服务器和客户端代码:
g++ server.cpp message.pb.cc -o server -lprotobuf
g++ client.cpp message.pb.cc -o client -lprotobuf
运行服务器和客户端:
./server
运行时报错:
[root@d0a10381127c protobuf-test]# ./server ./server: error while loading shared libraries: libprotobuf.so.30: cannot open shared object file: No such file or directory
全局搜索缺少的库,发现在下面的路径里 find / -name libprotobuf.so.30
/home/protobuf-3.19.2/src/.libs/libprotobuf.so.30
/usr/local/lib/libprotobuf.so.30
临时解决:ldconfig /usr/local/lib
永久解决:更改 vi /etc/ld.so.conf 添加上/usr/local/lib 即可。
在另一个终端窗口中运行:
./client