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

Ami*_*yan 10 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);
Run Code Online (Sandbox Code Playgroud)

但对于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?
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

caf*_*caf 14

s6_addr成员struct in6_addr定义为:

uint8_t s6_addr[16];
Run Code Online (Sandbox Code Playgroud)

由于它是一个数组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);
Run Code Online (Sandbox Code Playgroud)