2

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

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

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

4

2 回答 2

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

于 2011-06-02T21:03:15.813 回答
1

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

127.0.0.1       localhost.localdomain   localhost aiur

gethostbyname只需将主机名(aiure在此示例中)解析为地址。如果它找到它,/etc/hosts它非常乐意给你它。

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

顺便说一句,如果您相信 kernel.org ,gethostbyname则它已过时;如果您相信 MSDN,则不推荐使用。

于 2011-06-02T21:02:54.813 回答