之前在使用消息队列传输数据时发生了数据位莫名丢失两个字节的情况。
经过一番debug
找到了问题的原因,字节对齐问题。
我的消息队列信息结构体原本的格式如下:
struct msg_data
{
long msg_type; //类型字段取161
uint32_t sid;
uint32_t total_len; //数据的总长度
uint32_t length; //数据长度
uint16_t split;
uint32_t offset;
uint8_t data[1000];
};
问题就出在 split这个字段,它为16bits,而一般系统都是32bits一行一行存储数据的,由于 split 之后offset是32bits的,于是系统就会将 split后面填入16bits,也就整个讲后面的data字段挤出了两个字节。
在发送时,我的msgsnd函数仍然设置message size是 1018个字节(实际由于对其已经是1020字节),所以data[998] data[999]就丢失了
修改办法就是在写结构体时让它天然对齐,例如换位置:
struct msg_data
{
long msg_type; //类型字段取161
uint32_t sid;
uint32_t total_len; //数据的总长度
uint32_t length; //数据长度
uint32_t offset;
uint16_t split;
uint8_t data[1000];
};
这样就对齐了
bug消除
本文深入探讨了在使用消息队列进行数据传输时遇到的字节对齐问题,详细解析了由于结构体中16bits字段导致的数据位丢失现象,并提供了有效的解决方案。
2157

被折叠的 条评论
为什么被折叠?



