我正在为网络应用程序添加IPv6支持。某些控制数据包应包含IPv4和IPv6地址的混合列表(当前代码仅支持IPv4):
struct control_packet {
[...]
ushort ip1_afi;
struct in_addr ip1;
ushort ip2_afi;
struct in_addr ip2;
uchar reserved1;
uchar prefix_mask_len;
ushort prefix_afi;
struct in_addr prefix;
} __attribute__ ((__packed__));
我应该如何替换oder中的in_addr结构以支持IPv4和IPv6,从而取代之前的AFI值?
我认为我不能使用sockaddr_storage
,因为它会保留比数据包所需的空间更多的空间。
我见过有人使用uchar ip1[0]
,但后来我可能需要手动组装数据包,而不是使用结构。有什么建议吗?
我也接受良好的RTFM链接:)
谢谢!
答案 0 :(得分:2)
您只需使用union
struct in_addr
和struct in6_addr
代替您现在拥有的struct in_addr
。
答案 1 :(得分:0)
在我看来,基本上sockaddr
结构已经在同一条思路中实现了某些东西; sa_family
成员告诉它是ip4还是ip6。
我会选择将afi
和in_addr
字段粘合在一起,将其放到ip [46]地址的正确抽象中。