IPv6下的网络字节顺序是否无意义?

xml*_*lmx 2 c c++ ipv4 ipv6 htonl

如果我们使用32位整数来存储IPv4地址,则必须考虑整数的字节顺序.

但是,由于几乎所有平台下都没有内置的128位整数类型,因此必须将IPv6地址存储到字节数组中,因此,我认为字节顺序不再是问题.

我对么?或者IPv6是否有相应的功能htonlXXX?

mrb*_*ude 10

IPv6确实需要ipv6地址的网络字节顺序.hton和ntoh都是关于将地址从存储在代码中的方式转换为如何将其存储在数据包中(反之亦然).所以问题就变成了如何将它存储在代码中.

此外,代码中IPv6地址的定义可以允许更多的方式来解决它而不仅仅是一个字节数组:

struct in6_addr
{
    union 
    {
        __u8 u6_addr8[16];
        __u16 u6_addr16[8];
        __u32 u6_addr32[4];
    } in6_u;
#define s6_addr in6_u.u6_addr8
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
};
Run Code Online (Sandbox Code Playgroud)

对用户来说,IPv6地址表示为8个16位值.如果在代码中将地址存储为8个16位值,则在使用u6_addr16 []数组将其放入数据包时,需要在每个16位值上使用htons,并在检索每个16位时使用ntohs 16来自u6_addr16 []的位值.

这些链接很有帮助:

http://msdn.microsoft.com/en-us/library/ee175867.aspx

http://en.wikipedia.org/wiki/IPv6_address(特别是右上角的图表)

  • 你确定没错吗?如果您将IPv4地址存储为两个uint16_t值的数组,则在每一半上执行htons与在整个uint32_t地址上执行htonl不同. (3认同)