如何将ipv6地址从网络顺序转换为主机顺序

时间:2018-12-06 16:32:27

标签: c linux ipv6 endianness

说,ipv6定义为:

struct in6_addr
{
    union 
    {
        __u8        u6_addr8[16];
        __be16      u6_addr16[8];
        __be32      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
};

对于ipv4(32位整数),我们将字节序转换为(使用htonl()):

Little endian: 0x0A0B0C0D
Big endian   : 0x0D0C0B0A

我正在解析来自网络的数据包。因此,如果我将ipv6视为u6_addr32[4],是否正确?

u32_nw_order[0] = inet_ntop(u32_host_order[3])
u32_nw_order[1] = inet_ntop(u32_host_order[2])
u32_nw_order[2] = inet_ntop(u32_host_order[1])
u32_nw_order[3] = inet_ntop(u32_host_order[0])

处理128位IPv6地址的字节序转换的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您不需要,IPv6地址不会被编码或处理为多字节整数,因此没有关于网络/主机字节序的概念。 IPv6地址只是一个16字节的序列。

  

因此,如果我将ipv6视为u6_addr32 [4]

不这样做,通常没有理由-只处理__u8 u6_addr8[16];