首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gethostbyname()仅返回linux上本地主机的地址

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

Stack Overflow用户
提问于 2011-06-03 04:47:23
回答 2查看 5.4K关注 0票数 2

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

问题是,在linux上,我得到的唯一地址是127.0.0.1。这在Windows上可以工作,我见过一些人说,如果你的网络是用DHCP配置的,这在Linux上就不能工作(不知道这是不是真的)。

在Linux上这样做不是正确的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-03 05:03:16

在unix/linux上,这不是正确的方式。正确的方法包括使用ioctls提取必要的信息。

代码语言:javascript
复制
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

还有一些更现代的方法,包括:

代码语言:javascript
复制
if_nameindex()

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

票数 1
EN

Stack Overflow用户

发布于 2011-06-03 05:02:55

之所以会发生这种情况,是因为在大多数发行版中,/etc/hosts中都有这样的代码

代码语言:javascript
复制
127.0.0.1       localhost.localdomain   localhost aiur

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

回到问题上来。不幸的是,我不相信你能以一种可移植的方式获得你机器的所有地址。您可以使用Unix可移植的方式来实现,就像ifconfig一样。打开socket s并执行ioctl(..., SIOCGIFCONF, ...)

顺便说一句,如果你相信gethostbyname,那么就是过时的;如果你相信kernel.org,那么就是过时的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6220204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档