Linux getaddrinfo獲得本機ip地址為何127.0.1.1?


通過gethostname + getaddrinfo , 得到本機ip地址為127.0.1.1 , 而非127.0.0.1. 為何?

源代碼

來源: Linux編程獲取本機IP地址的幾種方法

int main(int argc, const char **argv)
{
    int ret;
    char host_name[128] = {0};
    struct addrinfo *res, *cur;
    struct sockaddr_in *addr;

    if (gethostname(host_name, sizeof(host_name)) < 0)
    {
        printf("gethostname error\n");
        return -1;
    }
    ret = getaddrinfo(host_name, NULL, NULL, &res);
    if (ret != 0)
    {
        printf("Error: error in getaddrinfo on hostname: %s\n", gai_strerror(ret));
        return -1;
    }
    for(cur = res; cur != NULL; cur = cur->ai_next)
    {
        if(cur->ai_family == AF_INET)
        {
            addr = (struct sockaddr_in*)cur->ai_addr;
            printf("local ip:%s\n", inet_ntoa(addr->sin_addr));
        }
    }
    freeaddrinfo(res);
    return 0;
}

運行輸出

local ip:127.0.1.1
local ip:127.0.1.1
local ip:127.0.1.1

問題

  1. 為何是3行?
  2. 為何得到ip地址127.0.1.1?

對於問題1, 查看ip網卡配置信息, 發現有3個網卡配置信息

$ ifconfig -a

對於問題2, 查看/etc/hosts. 可以看到對應與主機名martin-ThinkPad-T480, ip地址是127.0.1.1. 而martin-ThinkPad-T480 正是通過gethostname得到.
這也是在告訴我們, getaddrinfo取得的不是本地網卡ip地址, 而是hosts文件的配置name的ip地址.
2種解決辦法:

  1. 修改hosts文件, 主機名對應ip地址;
  2. 不用gethostname取得主機名, 而是直接用localhost;
$ vim /etc/hosts
127.0.0.1   localhost
127.0.1.1   martin-ThinkPad-T480

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

總結

  1. getaddrinfo得到的IP地址不是真實網卡ip地址, 而是/etc/hosts配置的用戶名對應ip地址, 因此不適合用於動態取得本機網卡ip地址, 更適合於本地回環測試;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM