Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
Sockets 如何将sockaddr_in6::sin6_addr字节顺序设置为网络字节顺序?_Sockets_Networking_Byte_Htonl - Fatal编程技术网

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

Sockets 如何将sockaddr_in6::sin6_addr字节顺序设置为网络字节顺序?,sockets,networking,byte,htonl,Sockets,Networking,Byte,Htonl,我正在开发一个网络应用程序并使用socket API 我想在6结构中设置sockaddr_的sin6_addr字节顺序 对于16位或32位变量,很简单:使用HTON或htonl: // IPv4 sockaddr_in addr; addr.sin_port = htons(123); addr.sin_addr.s_addr = htonl(123456); 但对于128位变量,我不知道如何将字节顺序设置为网络字节顺序: // IPv6 sockaddr_in6 addr; addr.sin

我正在开发一个网络应用程序并使用socket API

我想在6结构中设置sockaddr_的sin6_addr字节顺序

对于16位或32位变量,很简单:使用HTON或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?
有些答案可能使用HTON 8次(2*8=16字节),或者使用htonl 4次(4*4=16字节),但我不知道哪种方式是正确的


谢谢。

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

6\u addr结构中的
s6\u addr
成员定义为:

uint8_t s6_addr[16];
由于它是一个
uint8\u t
数组,而不是一个单一的128位整数类型,因此不会出现终止性问题:只需从源
uint8\u 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);

老实说,我开发了一个图书馆。访问主机名有一些限制。@Amir Saniyan什么限制?整个互联网使用主机名而不是IP地址,并将后者委托给名为DNS的数据库。你的情况有什么不同?在任何情况下,您所要做的就是将IP地址存储在八位字节中,即字节,与写入它们的顺序相同,然后完成任务。