gethostbyname()只返回linux上本地主机的地址

时间:2011-06-02 20:47:23

标签: sockets bsd gethostbyname

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

问题是在linux上,我得到的唯一地址是127.0.0.1。这适用于Windows,我见过一些人说如果您的网络是由DHCP配置的话,这在Linux上是行不通的(不知道这是不是真的说法)。

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

2 个答案:

答案 0 :(得分:1)

这是因为在大多数发行版中,您在/etc/hosts中都有此内容:

127.0.0.1       localhost.localdomain   localhost aiur

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

回到问题。不幸的是,我不相信你能以便携的方式获得你机器的所有地址。你可以用Unix-portable方式完成它,比如ifconfig。打开套接字s并执行ioctl(..., SIOCGIFCONF, ...)

顺便说一句,gethostbyname 已过时如果您认为kernel.org而已弃用,如果您认为MSDN。

答案 1 :(得分:1)

这不是unix / linux上的正确方法。正确的方法是让ioctls提取必要的信息。

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搜索会产生许多与此类似的问题。