gpt4 book ai didi

c - 辅助套接字数据,对齐问题?

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:34 25 4
gpt4 key购买 nike

freebsd 的 ping 源代码中,当代码处理包含来自 SO_TIMESTAMPtimestamp 的控制数据时,我注意到了这一点套接字选项:

这里的例子:

            #ifdef SO_TIMESTAMP
if (cmsg->cmsg_level == SOL_SOCKET &&
cmsg->cmsg_type == SCM_TIMESTAMP &&
cmsg->cmsg_len == CMSG_LEN(sizeof *tv)) {
/* Copy to avoid alignment problems: */
memcpy(&now, CMSG_DATA(cmsg), sizeof(now));
tv = &now;
}
#endif

作者想到的对齐问题是什么?为什么仅保存指向 CMSG_DATA(cmsg) 的指针还不够?

在处理相同情况时,我自己复制辅助数据重要吗?

完整的源代码在这里:( See docs )

最佳答案

cmsg 是一个struct cmsghdr,它是一个可变长度结构,由开头的几个字段组成,后面是从cmsg_data< 开始的任意字节。由于在编译时不知道任意字节的结构,因此字节开始的位置可能无法为结构中的字段提供正确对齐的位置。 (有关一些背景信息,请参阅 http://en.wikipedia.org/wiki/Data_structure_alignment)。

所以这里发生的是 if 语句中的表达式在运行时检查任意字节实际是什么类型的数据。如果级别、类型和长度指示数据是 struct timeval,则将字节复制(通过 CMSG_DATA 宏)到堆栈上正确对齐的结构中.

关于c - 辅助套接字数据,对齐问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20859553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com