我可以拥有一个地址族独立网络数据包结构吗?

时间:2010-08-11 09:27:54

标签: c networking network-programming struct

我正在为网络应用程序添加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链接:)

谢谢!

2 个答案:

答案 0 :(得分:2)

您只需使用union struct in_addrstruct in6_addr代替您现在拥有的struct in_addr

答案 1 :(得分:0)

在我看来,基本上sockaddr结构已经在同一条思路中实现了某些东西; sa_family成员告诉它是ip4还是ip6。

我会选择将afiin_addr字段粘合在一起,将其放到ip [46]地址​​的正确抽象中。