之前我正在组播这样的事情:
struct Message
{
char cat[3];
uint64_t foo;
uint16_t bar;
} __attribute((packed));
Message MESSAGE;
int main(void)
{
//every now and then
memcpy(MESSAGE.cat, bla, 3);
MESSAGE.foo = varA;
MESSAGE.bar = varB - varC;
sendto(fd, &MESSAGE, sizeof(MESSAGE), 0, &sockAddr, sizeof(sockAddr));
}
接收方的声明是,即使foo
没问题,他们也会收到消息,bar
和cat
也会被扰乱。并且他们期望Big Endian获得积分值。所以我改变了我的代码来做到这一点:
int main(void)
{
//every now and then
memcpy(MESSAGE.cat, bla, 3);
MESSAGE.foo = bswap_64(varA);
MESSAGE.bar = varB - varC;
MESSAGE.bar = bswap_16(MESSAGE.bar);
sendto(fd, &MESSAGE, sizeof(MESSAGE), 0, &sockAddr, sizeof(sockAddr));
}
并且索赔仍然相同。这怎么可能? Big vs Little endian是二进制的,如果不是之前的话。或者上面的逻辑有什么问题吗?
答案 0 :(得分:1)
您需要查找http://linux.die.net/man/3/ntohl
将内容转换为网络顺序然后重建。
答案 1 :(得分:0)
尝试在发送之前将数据包保存到文件中 - 这样您就可以检查它。