地址轉換函數:inet_aton & inet_ntoa & inet_addr和inet_pton & inet_ntop


  在Unix網絡編程中,我們常用到地址轉換函數,它將ASCII字符串(如"206.62.226.33")與網絡字節序的二進制值(這個值保存在套接口地址結構中)間進行地址的轉換。

  1、inet_aton、inet_addr和inet_ntoa在點分十進制數串(例如"206.62.226.33")與它的32位網絡字節序二進制值間轉換IPv4地址。

  2、兩個較新的函數: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。

  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地址轉換為相應的點分十進制數串。

  

  inet_pton和inet_ntop兩個函數較新,對IPv4和IPv6地址都能進行處理,字母p代表presentation,字母n代表numeric。地址的表達格式通常是ASCII串,數值格式則是存在於套接口地址結構中的二進制值。

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>中有如下定義:

  

1 #define INET_ADDRSTRLEN 16     /* for IPv4 dotted-decimal */
2 #define INET6_ADDRSTRLEN 46   /* for IPv6 hex string */

  如果len太小,無法容納表達格式結果(包括終止的空字符),則返回一個空指針,並置errno為ENOSPC。

  函數inet_ntop的參數strptr可不能是個空指針,調用者必須為目標分配內存指定大小。成功時,此指針即函數的返回值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM