這些天一直在看《UNP》,覺得有必要對一些東西做一下總結(其實只是抄一抄書),加深一下印象。
IP地址轉換函數有兩組,它們可以在字符串和網絡字節序的二進制值之間轉換IP地址
適用於IPv4地址的函數
1 #include <arpa/inet.h> 2 3 /* Convert Internet host address from numbers-and-dots notation in CP 4 into binary data and store the result in the structure INP. */ 5 int inet_aton (const char *__cp, struct in_addr *__inp); 6 7 /* Convert Internet host address from numbers-and-dots notation in CP 8 into binary data in network byte order. */ 9 in_addr_t inet_addr (const char *__cp); 10 11 /* Convert Internet number in IN to ASCII representation. The return value 12 is a pointer to an internal array containing the string. */ 13 char *inet_ntoa (struct in_addr __in);
以上三個函數在點分十進制數串(如“127.0.0.1")和32位網絡字節序二進制值之間轉換IPv4地址。
inet_aton將__cp指向的字符串轉成網絡序的地址存在__inp指向的地址結構。成功返回1,否則返回0。(據書中所說,如果__inp指針為空,那么該函數仍然對輸入字符串進行有效性檢查但是不存儲任何結果)
inet_addr功能和inet_aton類似,但是inet_addr出錯時返回INADDR_NONE常值(通常是32位均為1的值),這就意味着至少有一個IPv4的地址(通常為廣播地址255.255.255.255)不能由該函數處理。建議使用inet_aton代替inet_addr。
inet_ntoa將網絡序二進制IPv4地址轉換成點分十進制數串。該函數的返回值所指向的字符串駐留在靜態內存中。這意味着該函數是不可重入的。同時我們也該注意到該函數以一個結構體為參數而不是常見的以一個結構體指針作為參數。
對IPv4地址和IPv6地址同時都適用的函數
1 #include <arpa/inet.h> 2 3 /* Convert from presentation format of an Internet number in buffer 4 starting at CP to the binary network format and store result for 5 interface type AF in buffer starting at BUF. */ 6 int inet_pton (int __af, const char *__restrict __cp, 7 void *__restrict __buf); 8 9 /* Convert a Internet address in binary network format for interface 10 type AF in buffer starting at CP to presentation form and place 11 result in buffer of length LEN astarting at BUF. */ 12 const char *inet_ntop (int __af, const void *__restrict __cp, 13 char *__restrict __buf, socklen_t __len);
這兩個函數的__af參數既可以是AF_INET也可以是AF_INET6。如果以不支持的地址族作為參數就會返回一個錯誤,並將errno置為EAFNOSUPPORT。
inet_pton將字串轉成對應的網絡序二進制值,inet_ntop做相反的事情,其中__len參數指定目標緩沖區的大小,在<netinet/in.h>頭文件中定義了
1 #define INET_ADDRSTRLEN 16 /* for IPv4 dotted-decimal */ 2 #define INET6_ADDRSTRLEN 46 /* for IPv6 hex string */
如果給的__len太小那么會返回一個空指針,並置errno為ENOSPC。