我正在尝试从this code
了解以下广播char out_packet_buffer[4500] ;
struct ip6_hdr *iphdr ;
iphdr = (struct ip6_hdr *) &out_packet_buffer[0];
我的理解是否正确结构iphdr的成员变量存储在char数组out_packet_buffer中?在代码的后面,从不使用out_packet_buffer。相反,iphdr被记忆到uint8_t内存位置(ether_frame)。但是iphdr不是uint8_t。
我很感激任何指导,让我了解这里发生的事情。
由于
答案 0 :(得分:1)
我的理解是否正确,结构iphdr的成员变量存储在char数组out_packet_buffer中?
有点儿。在这个演员阵容中发生的事情是我们开始“查看”从&out_packet_buffer[0]
(或仅out_packet_buffer
)开始的内存块作为struct ip6_hdr
而不是char[]
。< / p>
以后使用iphdr
时使用相同的内存,但会将其拆分为struct ip6_hdr
成员而不是char
正如@Christian Gibbons所说,我也认为这违反了strict aliasing即UB
答案 1 :(得分:1)
看起来代码正在准备通过网络传输的数据包。数据包将包含标头和有效负载。据推测,整个数据包存储在out_packet_buffer中。 ip6_header结构是这个的前几个字节,后面跟着数据有效负载。使用头部的结构使代码更具可读性,但在将其发送到套接字之前,可能会有“网络顺序的结构顺序”功能。
在任何情况下,数据包只是一个字节序列,因此将其转换为任何8位类型都是可行的