Linuxc++socket 接收protobuf并解码的demo,消息头定义了消息类型,消息长度,C++定义如下: #include<stdint.h> #pragma pack(push,1) enum FiuType { FIU_Heartbeat = 0, FIU_InstrumentDefine = 1, FIU_Snap = 2, FIU 金融数据服务 20 FIU_Order = 3, FIU_Trade = 4, FIU_Equilibrium = 5, FIU_CODE_END = 6, FOU_MAX }; struct FiuHeader { FiuHeader() { memset(this, 0, sizeof(*this)); usLen = sizeof(*this); } uint16_t usLen; uint8_t cType; }; #pragma pack(pop)
时间: 2024-03-05 20:48:04 浏览: 101
以下是一个简单的示例代码,演示如何在 Linux C++ Socket 中接收 Protobuf 并解码,前提是你已经将 Protobuf 安装在了你的系统上。
```
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <google/protobuf/message.h>
#include "header.pb.h"
using namespace std;
int main() {
// 创建一个 TCP Socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
cerr << "Failed to create socket!" << endl;
return -1;
}
// 设定服务器的 IP 地址和端口号
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8000);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 连接服务器
int ret = connect(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
if (ret == -1) {
cerr << "Failed to connect to server!" << endl;
close(sockfd);
return -1;
}
// 接收消息头
FiuHeader header;
int n = recv(sockfd, &header, sizeof(header), 0);
if (n != sizeof(header)) {
cerr << "Failed to receive message header!" << endl;
close(sockfd);
return -1;
}
// 根据消息类型解码 Protobuf 消息
google::protobuf::Message* message = nullptr;
switch (header.cType) {
case FIU_Heartbeat:
message = new Heartbeat;
break;
case FIU_InstrumentDefine:
message = new InstrumentDefine;
break;
case FIU_Snap:
message = new Snap;
break;
case FIU_Order:
message = new Order;
break;
case FIU_Trade:
message = new Trade;
break;
case FIU_Equilibrium:
message = new Equilibrium;
break;
case FIU_CODE_END:
default:
cerr << "Invalid message type!" << endl;
close(sockfd);
return -1;
}
// 接收 Protobuf 消息
n = recv(sockfd, message, header.usLen - sizeof(header), 0);
if (n != header.usLen - sizeof(header)) {
cerr << "Failed to receive Protobuf message!" << endl;
close(sockfd);
return -1;
}
// 打印 Protobuf 消息
cout << "Received message: " << endl;
cout << message->DebugString() << endl;
// 关闭 Socket
close(sockfd);
return 0;
}
```
在此示例代码中,我们通过 Socket 接收消息头(即结构体 FiuHeader),然后根据消息类型(即结构体 FiuHeader 中的字段 cType)创建相应的 Protobuf 消息对象,并通过 Socket 接收 Protobuf 消息。最后,我们将接收到的 Protobuf 消息打印出来。请注意,此示例代码仅适用于仅包含一个 Protobuf 消息的情况,如果你的消息中包含多个 Protobuf 消息,你可能需要更复杂的逻辑来处理。
阅读全文