gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:19 24 4
gpt4 key购买 nike

我有一个通过套接字发送给客户端的结构。客户端和服务器都在同一体系结构上,因此不存在字节序问题。我正确地收到了 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 的值并未全部初始化,因此读取它会导致未定义的行为。您需要以一种或另一种方式初始化所有元素(最短的方法是在结构定义中执行 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 可能不会以 null 终止(您可能需要采取预防措施)。

关于c++ - 序列化和反序列化套接字中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14392715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com