2011-05-17 121 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