天天看點

getifaddrs()和struct ifaddrs的使用,擷取本機IP

    ifaddrs結構體定義如下:

struct ifaddrs 
{ 
    struct ifaddrs  *ifa_next;    /* Next item in list */ 
    char            *ifa_name;    /* Name of interface */ 
    unsigned int     ifa_flags;   /* Flags from SIOCGIFFLAGS */ 
    struct sockaddr *ifa_addr;    /* Address of interface */ 
    struct sockaddr *ifa_netmask; /* Netmask of interface */ 
    union 
    { 
        struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */ 
        struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */ 
    } ifa_ifu; 
    #define              ifa_broadaddr ifa_ifu.ifu_broadaddr 
    #define              ifa_dstaddr   ifa_ifu.ifu_dstaddr 
    void            *ifa_data;    /* Address-specific data */ 
};       

    ifa_next指向連結清單的下一個成員;ifa_name是接口名稱,以0結尾的字元串,比如eth0,lo;ifa_flags是接口的辨別位(比如當IFF_BROADCAST或IFF_POINTOPOINT設定到此辨別位時,影響聯合體變量ifu_broadaddr存儲廣播位址或ifu_dstaddr記錄點對點位址);ifa_netmask存儲該接口的子網路遮罩;結構體變量存儲廣播位址或點對點位址(見括弧介紹ifa_flags);ifa_data存儲了該接口協定族的特殊資訊,它通常是NULL(一般不關注他)。

    函數getifaddrs(int getifaddrs (struct ifaddrs **__ifap))擷取本地網絡接口資訊,将之存儲于連結清單中,連結清單頭結點指針存儲于__ifap中帶回,函數執行成功傳回0,失敗傳回-1,且為errno指派。

    很顯然,函數getifaddrs用于擷取本機接口資訊,比如最典型的擷取本機IP位址。