10

我开发一个网络应用程序并使用套接字 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 字节),但我不知道哪种方式是正确的。

谢谢。

4

2 回答 2

16

s6_addr成员struct in6_addr定义为:

uint8_t s6_addr[16];

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

static const uint8_t myaddr[16] = { 0x20, 0x01, 0x08, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };

memcpy(addr.sin6_addr.s6_addr, myaddr, sizeof myaddr);
于 2011-05-18T05:34:32.280 回答
0

通常的做法是使用主机名查找例程之一并使用其结果,该结果已经按网络字节顺序排列。您为什么要处理硬编码的数字 IP 地址?

于 2011-05-17T09:53:30.637 回答