天天看點

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

位址轉換函數: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位址都能進行處理。

  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串,數值格式則是存在于套接口位址結構中的二進制值。

  兩個函數的參數family既可以是AF_INET,也可以是AF_INET6。如果以不被支援的位址族作為family參數,兩個函數都傳回錯誤,并将errno置為EAFNOSUPPORT。

  第一個函數轉換由指針strptr所指的串,通過指針addrptr存儲二進制結果,如果成功,則傳回值為1;如果對于指定的family輸入串不是有效的表達格式,則傳回值為0.

  inet_ntop進行相反的轉換,即從數值格式(addrptr)到表達格式(strptr)進行轉換。參數len是目标的大小,以免函數溢出其調用者的緩沖區。為有助于規定這個大小,在頭檔案<netinet/in.h>中有如下定義:

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

  函數inet_ntop的參數strptr可不能是個空指針,調用者必須為目标配置設定記憶體指定大小。成功時,此指針即函數的傳回值。

繼續閱讀