在Unix網絡編程中,咱們經常使用到地址轉換函數,它將ASCII字符串(如"206.62.226.33")與網絡字節序的二進制值(這個值保存在套接口地址結構中)間進行地址的轉換。編程
一、inet_aton、inet_addr和inet_ntoa在點分十進制數串(例如"206.62.226.33")與它的32位網絡字節序二進制值間轉換IPv4地址。網絡
二、兩個較新的函數:inet_pton和inet_ntop對IPv4和IPv6地址都能進行處理。函數
1 #include<arpa/inet.h> 2 3 /* 返回1:串有效,返回0:串出錯 */ 4 int inet_aton(const char *strptr, struct in_addr *addrptr); 5 6 /* 若成功,返回32位二進制的網絡字節序地址;若出錯,返回INADDR_NONE */ 7 in_addr_t inet_addr(const char *strptr); 8 9 /* 返回指向點分十進制數串的指針 */ 10 char* inet_ntoa(struct in_addr inaddr);
inet_aton將strptr所指的C字符轉換爲32位網絡字節序二進制值,並用一個出參addrptr來存儲,返回值爲1表明成功,不然返回0。spa
inet_addr與inet_aton不一樣在於,他的返回值爲轉換後的32位網絡字節序二進制值,而不是做爲出參返回,這樣存在一個問題,他的返回值返回的有效IP地址爲0.0.0.0到255.255.255.255,若是函數出錯,返回常量值INADDR_NONE(這個值通常爲一個32位均爲1的值),這意味着點分二進制數串255.255.255.255(IPv4的有限廣播地址)不能由此函數進行處理。指針
inet_ntoa將一個32位的網絡字節序二進制IPv4地址轉換爲相應的點分十進制數串。code
inet_pton和inet_ntop兩個函數較新,對IPv4和IPv6地址都能進行處理,字母p表明presentation,字母n表明numeric。地址的表達格式一般是ASCII串,數值格式則是存在於套接口地址結構中的二進制值。blog
1 #include<arpa/inet.h> 2 3 /* 若函數成功,則返回1;若輸入不是有效的格式,則函數返回0;若處理失敗,函數返回-1 */ 4 int inet_pton(int family, const char *strptr, void *addrptr); 5 6 /* 若函數處理成功,返回指向結果的指針;若函數處理失敗,返回NULL */ 7 const char* inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
兩個函數的參數family既能夠是AF_INET,也能夠是AF_INET6。若是以不被支持的地址族做爲family參數,兩個函數都返回錯誤,並將errno置爲EAFNOSUPPORT。接口
第一個函數轉換由指針strptr所指的串,經過指針addrptr存儲二進制結果,若是成功,則返回值爲1;若是對於指定的family輸入串不是有效的表達格式,則返回值爲0.內存
inet_ntop進行相反的轉換,即從數值格式(addrptr)到表達格式(strptr)進行轉換。參數len是目標的大小,以避免函數溢出其調用者的緩衝區。爲有助於規定這個大小,在頭文件<netinet/in.h>中有以下定義:ci
1 #define INET_ADDRSTRLEN 16 /* for IPv4 dotted-decimal */ 2 #define INET6_ADDRSTRLEN 46 /* for IPv6 hex string */
若是len過小,沒法容納表達格式結果(包括終止的空字符),則返回一個空指針,並置errno爲ENOSPC。
函數inet_ntop的參數strptr可不能是個空指針,調用者必須爲目標分配內存指定大小。成功時,此指針即函數的返回值。