我有一个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值。问题在于数据值。我在这里做错了什么?..
答案 0 :(得分:1)
在您的代码中,您使用sizeof(s)
。这将是Packet*
的大小,而不是Packet
。将其替换为sizeof(*s)
以获得正确的尺寸。
此外,由于data
的值未全部初始化,因此通过读取它会导致未定义的行为。您需要以某种方式初始化所有元素(最简单的方法是在结构定义中执行char data[256] { };
)。
此外,由于这是C ++,您不需要说struct Packet
,只能说Packet
,除非您还有一个名为Packet
的函数。但是它只出现在你的代码中只有一半的时间,这意味着你没有,所以你可以放弃它。
正如Chris G所提到的那样,修复后你又遇到了另一个问题,那就是你要将整个Packet
复制到char[]
只有足够大的Packet
data
是memcpy(b, s->data, sizeof(s))
。变化
memcpy(b, s->data, sizeof(s->data))
到
data
并且意识到如果发件人没有为你做这件事(你可能想采取预防措施),这个{{1}}可能不会被终止。