2011-05-17 88 views
7

我正在开发一个网络应用程序并使用套接字API。如何设置sockaddr_in6 :: sin6_addr字节顺序为网络字节顺序?

我想设置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字节),但我不知道哪种方式是正确的。

谢谢。

回答

9

struct in6_addrs6_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); 
1

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

+0

老实说,我开发了一个库。访问主机名有一些限制。 – 2011-05-17 10:15:48

+0

@Amir Saniyan有什么限制?整个互联网使用主机名而不是IP地址,并将后者委托给称为DNS的数据库。你的情况有什么不同?在任何情况下,你所要做的就是将IP地址存储为八位字节,即字节,与您写入它们的顺序相同,并完成工作。 – EJP 2011-05-18 06:08:05