Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将ipv6地址从网络顺序转换为主机顺序_C_Linux_Ipv6_Endianness - Fatal编程技术网

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

C 如何将ipv6地址从网络顺序转换为主机顺序,c,linux,ipv6,endianness,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 s

例如,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位整数),我们将endianess转换为(使用
htonl()
):

我正在解析来自网络的数据包。因此,如果我认为IPv6是<代码> U6AADDR32(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地址的端号转换的正确方法是什么?

您不需要这样做,IPv6地址不作为多字节整数编码或处理,因此没有网络/主机端号的概念。IPv6地址只是一个16字节的序列

所以,如果我认为IPv6为U6AADDR32 [ 4 ] < /P>


不要这样做,通常没有理由-只处理
\uuuuuu6\uaddr8[16]

好的,所以我按原样存储它。1.对于
printf
,我可以使用
inet\u ntoh()。2.为了比较,我可以做
memcmp
.1。您需要使用inet_ntop()(或getaddrinfo())。2.对
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])