序列化和反序列化套接字中的结构

serialize and deserialize structures in sockets

本文关键字:结构 套接字 反序列化 序列化      更新时间:2023-10-16

我有一个Struct通过套接字发送到客户端。客户端和服务器都在同一个体系结构上,所以不存在端到端问题。我正确地接收了int值。但不能正确接收char[]值。这就是结构。

struct Packet {
int id;
int number;
char data[256];
};

在服务器端,我序列化数据并写入客户端。

struct Packet *s = new Packet();
s->id= htonl(1000);
s->number= htonl(7788);
memcpy(s->data, "MESSAGE", 7);
n =  write(NewSockFD , s ,sizeof(s) );

在客户端,我反序列化数据。

n = read(SockFD , Buffer , sizeof(Buffer));
struct Packet *s = (struct Packet*)Buffer;
char b[256];
int i = ntohl(s->id);
int j = ntohl(s->number);
memcpy(b, s->data, sizeof(s));

我正确地接收到id和number值。问题在于数据值。我做错了什么??

在代码中,您使用sizeof(s)。这是Packet*的大小,而不是Packet。将其替换为sizeof(*s)以获得正确的尺寸

此外,由于data的值没有全部初始化,因此从它读取会导致未定义行为。您需要以某种方式初始化所有元素(最短的方法是在struct定义中执行char data[256] { };)。

因为这是c++,你不需要说struct Packet,你可以只说Packet,除非你也有一个名为Packet的函数。但是它只出现在你的代码中一半的时间,这意味着你不需要,所以你可以把它删掉。

正如Chris G所提到的,在你解决了这个问题之后,你有另一个问题,那就是你将整个Packet复制到char[]中,而Packetdata只足够大。把

memcpy(b, s->data, sizeof(s))

memcpy(b, s->data, sizeof(s->data))

并且要意识到,如果发送方没有为您这样做(您可能希望采取预防措施),则此data可能不会以空终止。