在C中序列化,Beej的指南不理解为什么它不起作用?

时间:2017-09-30 03:50:33

标签: c sockets serialization

所以我正在阅读关于Beej指南的一些内容,我正在使用pack函数将数据序列化到一个缓冲区,一切都很好,直到我得到以下内容我开始遇到这种行为。

int packetsize = pack(buf, "HH",cinfo->id,cinfo->port);

  int16_t client_id;
  int16_t portnumber;
  unpack(buf, "HH", &client_id,&portnumber);
  printf("LOGIN with id: %" PRId16 "=%d portnumber:%d \n", client_id, cinfo->id, portnumber);

提供此输出

LOGIN with id: 0=1 portnumber:1151

但如果我稍微改变它

int16_t portnumber, client_id;
unpack(buf, "HH", &client_id,&portnumber);
printf("LOGIN with id: %" PRId16 "=%d portnumber:%d \n", client_id, cinfo->id, portnumber);

输出更改

LOGIN with id: 1=1 portnumber:1150

你知道这可能会发生在这里吗?

编辑1:

HH和hh都会发生这种情况,它可能是@Artemy建议的内存溢出但我不确定为什么会发生这种情况,因为它们的大小都相同,并且缓冲区足够大。虽然不确定原因,但声明的顺序似乎很重要。

这有效

int16_t portnumber, client_id;

这不起作用。

int16_t client_id, portnumber;

编辑2,这是我正在使用的结构

typedef struct ClientInfo {
        char name[HOSTNAME_LEN], *ip_address;
        int16_t message_sent, message_received, status, socket, id, port;
        LIST_ENTRY(ClientInfo) clients;
} ClientInfo;

0 个答案:

没有答案