Google Protocol Buffer为此问题提供了一个巧妙的解决方案。请参考Google Protobol Buffer - C Implementaion
根据您的有效负载结构创建一个.proto文件,并将其保存为payload.proto
syntax="proto3"
message Payload {
int32 age = 1
string name = 2
} .
使用编译器编译.proto文件
protoc --c_out=. payload.proto
这将在您的目录中创建头文件payload.pb-c.h及其对应的payload.pb-c.c。
创建您的server.c文件并包含protobuf-c头文件。
#include<stdio.h>
#include"payload.pb.c.h"
int main()
{
Payload pload = PLOAD__INIT;
pload.name = "Adam";
pload.age = 1300000;
int len = payload__get_packed_size(&pload);
uint8_t buffer[len];
payload__pack(&pload, buffer);
}
在你的接收端 client.c
....
int main()
{
uint8_t buffer[MAX_SIZE]; // load this buffer with the socket data.
size_t buffer_len; // Length of the buffer obtain via read()
Payload *pload = payload_unpack(NULL, buffer_len, buffer);
printf("Age : %d Name : %s", pload->age, pload->name);
}
请确保在编译程序时使用
-lprotobuf-c标志。
gcc server.c payload.pb-c.c -lprotobuf-c -o server.out
gcc client.c payload.pb-c.c -lprotobuf-c -o client.out
recv_data
的初始化类型是uint8_t*
,而不是char*
? - Udayraj Deshmukh