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

时间:2013-01-18 05:08:07

标签: c++ sockets serialization client-server deserialization

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

1 个答案:

答案 0 :(得分:1)

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

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

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

正如Chris G所提到的那样,修复后你又遇到了另一个问题,那就是你要将整个Packet复制到char[]只有足够大的Packet datamemcpy(b, s->data, sizeof(s)) 。变化

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

data

并且意识到如果发件人没有为你做这件事(你可能想采取预防措施),这个{{1}}可能不会被终止。