1

我有一个 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 值。问题在于数据值。我在这里做错了什么???

4

1 回答 1

1

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

此外,由于 的值data并未全部初始化,因此通过读取它会导致未定义的行为。您需要以一种或另一种方式初始化所有元素(最短的方法是char data[256] { };在结构定义中进行)。

此外,由于这是 C++,你不需要说struct Packet,你可以说只是Packet,除非你还有一个名为Packet. 但它只出现在你的代码中,这意味着你没有,所以你可以放弃它。

正如 Chris G 所提到的,在你修复它之后你还有另一个问题,那就是你将一个整体复制Packet到一个char[]只有大到足以容纳一个Packet's 的data. 改变

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

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

并意识到data如果发件人没有为您执行此操作(您可能需要采取预防措施),这可能不会被终止。

于 2013-01-18T05:11:53.113 回答