如何将sockaddr_in6 :: sin6_addr字节顺序设置为网络字节顺序?

时间:2011-05-17 08:08:35

标签: sockets networking byte htonl

我开发网络应用程序并使用套接字API。

我想设置sockaddr_in6结构的sin6_addr字节顺序。

对于16位或32位变量,很简单:使用htons或htonl:

// IPv4
sockaddr_in addr;
addr.sin_port = htons(123);
addr.sin_addr.s_addr = htonl(123456);

但对于128位变量,我不知道如何将字节顺序设置为网络字节顺序:

// IPv6
sockaddr_in6 addr;
addr.sin6_port = htons(123);
addr.sin6_addr.s6_addr = ??? // 16 bytes with network byte order but how to set?

有些答案可能是使用htons 8次(2 * 8 = 16字节),或者使用htonl 4次(4 * 4 = 16字节),但我不知道哪种方法是正确的。

感谢。

2 个答案:

答案 0 :(得分:11)

s6_addr的{​​{1}}成员定义为:

struct in6_addr

由于它是uint8_t s6_addr[16]; 的数组,而不是单个128位整数类型,因此不会出现字节序问题:您只需从源uint8_t数组复制到目标。例如,要复制地址uint8_t [16],您可以使用:

2001:888:0:2:0:0:0:2

答案 1 :(得分:0)

通常情况是使用其中一个主机名查找例程并使用其结果,该结果已经是网络字节顺序。你怎么会处理硬编码的数字IP地址?