網路位元組序之間的轉換函式詳解
接下來介紹兩組地址轉換函式,它們在ASCII字串和網路位元組序的二進位制值之間轉換網際地址。
(1).inet_aton,inet_addr和inet_ntoa在點分十進位制數串與它長度為32的網路位元組序二進位制值間轉換IPV4地址。你可能會在許多現有程式碼中見到這些函式。
(2)兩個較新的函式inet_pton和inet_ntop對於IPV4地址和IPV6地址都是適用的。
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
//返回:若字串有效則為1,否則為0
in_addr_t inet_addr(const char *strptr);
//返回:若字串有效則為32位二進位制網路位元組序的IPV4地址,否則為INADDR_None
char *inet_ntoa(struct in_addr inaddr);
//返回:指向一個點分十進位制數串的指標
第一個函式將strptr所指C字串轉換成一個32位的網路位元組序二進位制值,並通過指標addrptr來儲存。若成功則返回1,否則返回0。
inet_aton函式有一個沒有寫入正式文件中的特徵:如果addrptr指標為空,那麼該函式仍然對輸入的字串執行有效性檢查,但是不儲存任何結果。
inet_addr進行相同的轉換,返回值為32位的網路位元組序二進位制值。該函式存在一個問題:所有2的32次方個可能的二進位制值都是有效的Ip地址(0.0.0.0到255.255.255.255),但是當出錯時該函式返回INADDR_NONE常值(通常是一個32位均為1的值)。這意為著點分十進位制數串255.255.255.255不能由該函式處理,因為他的二進位制值被用來指示該函式失敗。
inet_addr函式還存在一個潛在問題:一些手冊頁面宣告該函數出錯時返回-1而不是INDDR_NONE。這樣在對該函式的返回值(一個無符號的值)和一個負常數(-1)進行比較是可能會發生錯誤,具體取決於C編譯器。
如今Inet_addr已經被廢棄,新的程式碼改為inet_aton函式。更加好的辦法是使用兩個新函式,他們對ipv4和ipv6都適用。
inet_ntoa函式將一個32位的網路位元組序二進位制IPV4地址轉換成相應的點分十進位制數串。由該函式的返回值所指向的字串駐留在靜態記憶體中。這意為著該函式是不可重入的,,最後需要注意,該函式以一個結構而不是以指向該結構的指標作為其引數