TCP/IP中32位IP地址與點分IP(字符串)轉換

在網絡上面我們用的IP都是數字加點(192.168.0.1)構成的, 而在struct in_addr結構中用的是32位的IP,我們上面那個32位IP(C0A80001)是的192.168.0.1 爲了轉換我們可以使用下面兩個函數  

    int inet_aton(const char *cp,struct in_addr *inp) 
    char *inet_ntoa(struct in_addr in) 

    函數裏面 a 代表 ascii n 代表network.第一個函數表示將a.b.c.d的IP轉換爲32位的IP,存儲在 inp指針裏面.第二個是將32位IP轉換爲a.b.c.d的格式.
 

    同樣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()函數來指向你自己的字符指針。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章