TCP/IP中32位IP地址與字串轉化
阿新 • • 發佈:2019-02-08
同樣inet_addr也可以進行字串到32位整形的轉換:
首先,假設你已經有了一個sockaddr_in結構體ina,你有一個IP地址"132.241.5.10" 要儲存在其中,你就要用到函式inet_addr(),將IP地址從 點數格式轉換成無符號長整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
有的也使用unsigned long dst_ip = inet_addr("");
可見IPv4 套介面地址結構
struct in_addr
{
in_addr_t s_addr ;
}
// 32bits IPv4 地址
//網路位元組順序 Network Byte Order
類似:
struct in_addr
{
unsigned long s_addr; // that’s a 32-bit long, or 4 bytes
};
這裡錯誤返回INADDR_NONE (實際上是-1,每位都是1)
而另一個INADDR_ANY的值為0,意思是任何地址都可以。
注意,inet_addr()返回的地址已經是網路位元組格式,所以你無需再呼叫 函式htonl()。
我們現在發現上面的程式碼片斷不是十分完整的,因為它沒有錯誤檢查。 顯而易見,當inet_addr()發生錯誤時返回-1。記住這些二進位制數字?(無符 號數)-1僅僅和IP地址255.255.255.255相符合!這可是廣播地址!大錯特 錯!記住要先進行錯誤檢查。
好了,現在你可以將IP地址轉換成長整型了。有沒有其相反的方法呢? 它可以將一個in_addr結構體輸出成點數格式?這樣的話,你就要用到函式 inet_ntoa()("ntoa"的含義是"network to ascii"),就像這樣:
printf("%s",inet_ntoa(ina.sin_addr));
它將輸出IP地址。需要注意的是inet_ntoa()將結構體in-addr作為一 個引數,不是長整形。同樣需要注意的是它返回的是一個指向一個字元的 指標。它是一個由inet_ntoa()控制的靜態的固定的指標,所以每次呼叫 inet_ntoa(),它就將覆蓋上次呼叫時所得的IP地址
char *a1, *a2;
.
.
a1 = inet_ntoa(ina1.sin_addr); /* 這是198.92.129.1 */
a2 = inet_ntoa(ina2.sin_addr); /* 這是132.241.5.10 */
printf("address 1: %s ",a1);
printf("address 2: %s ",a2);
輸出如下:
address 1: 132.241.5.10
address 2: 132.241.5.10
假如你需要儲存這個IP地址,使用strcopy()函式來指向你自己的字元指標。