【问题标题】:gethostbyname() only returns the address of local host on linuxgethostbyname() 只返回linux上本地主机的地址
【发布时间】:2011-09-07 09:24:08
【问题描述】:

我正在尝试以可移植方式(Windows 和 Linux)查找本地机器的所有 IP 地址。我使用的方法是首先调用gethostname(),然后将结果传递给gethostbyname(),它返回一个ip地址数组。

问题是在 linux 上,我得到的唯一地址是 127.0.0.1。这适用于 Windows,我看到一些人说如果您的网络是由 DHCP 配置的,这将不适用于 Linux(不知道这是否属实)。

这不是在 Linux 上执行此操作的正确方法吗?

【问题讨论】:

    标签: sockets bsd gethostbyname


    【解决方案1】:

    在 unix/linux 上这不是正确的方法。正确的方法是通过 ioctl 来拉取必要的信息。

    struct ifreq ifc_buffer[MAX_NUM_IFREQ];
    ioctl(s, SIOCGIFCONF, &ifc)  # Interface list
    num_ifreq = ifc.ifc_len / sizeof(struct ifreq);
    for(cnt=0;cnt<num_ifreq;cnt++)
      struct ifreq *ifr = &ifc.ifc_req[cnt]
      ioctl(s, SIOCGIFADDR, ifr); # get ip address
    

    还有更现代的方法涉及:

    if_nameindex()
    

    对 if_nameindex 和 SIOCGIFCONF 进行 SO 搜索将产生许多与此类似的问题。

    【讨论】:

      【解决方案2】:

      发生这种情况是因为在大多数发行版中,/etc/hosts

      127.0.0.1       localhost.localdomain   localhost aiur
      

      gethostbyname 只是将主机名(本例中为aiure)解析为地址。如果它在 /etc/hosts 中找到它,我们非常乐意为您提供。

      回到问题。不幸的是,我不相信您可以通过便携式方式获取机器的所有地址。你可以用 Unix 可移植的方式来做,就像ifconfig 一样。打开一个套接字s 并执行ioctl(..., SIOCGIFCONF, ...)

      顺便说一句,如果您相信 kernel.org,gethostbyname过时,如果您相信 MSDN,则 已弃用

      【讨论】:

        猜你喜欢
        • 2016-05-08
        • 1970-01-01
        • 2017-09-21
        • 2011-02-16
        • 2018-02-10
        • 1970-01-01
        • 2017-11-29
        • 1970-01-01
        • 2020-12-10
        相关资源
        最近更新 更多