How can I obtain the (IPv4) addresses for all network interfaces using only 100?经过广泛的调查,我发现:

  1. ifconfig使用SIOCGIFADDR,这需要打开套接字并提前了解所有接口名称.在Linux上的任何手册页面中也没有记录.
  2. proc包含/proc/net/dev,但这是一个接口统计信息列表.
  3. proc包含/proc/net/if_inet6,这正是我所需要的,但对于IPv6.
  4. 一般来说,在proc中很容易找到接口,但实际地址很少使用,除非明确地是某些连接的一部分.
  5. 有一个名为getifaddrs的系统调用,这是一个非常"神奇"的功能,你可以在Windows中看到.它也在BSD上实现.然而,它不是非常面向文本的,这使得它很难从非C语言中使用.

推荐答案

没有与/proc/net/if_inet6类似的IPv4

ifconfig:

fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)
ioctl(fd, SIOCGIFCONF, ...)

你会得到这样的结果:

ioctl(4, SIOCGIFCONF, {120, {{"lo", {AF_INET, inet_addr("127.0.0.1")}}, {"eth0", {AF_INET, inet_addr("10.6.23.69")}}, {"tun0", {AF_INET, inet_addr("10.253.10.151")}}}})

Linux相关问答推荐

git别名函数可以用单引号写吗?

无法在Raspberry PI 3 Model B上分配256TB的虚拟内存

如何检测文件系统是否支持权限?

用户作用域在Linux内核密钥环(Golang)中是什么意思?

为什么组合的查找和重命名命令在 bash shell 下不能按预期工作?

为什么控制台不接受反向换行?

使用 AWK 过滤 Linux 输出

如何更改文件的上次访问/修改/更改日期?

如何在bash中用另一个整数变量增加一个整数变量?

如何为命令的所有选项启用无密码 sudo?

如何使用 AWK 合并两个文件?

bash 中的sed命令

用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?

为什么这个命令会杀死我的 shell?

为什么 XGrabKey 会生成额外的聚焦和聚焦事件?

如何从任意 pthread_t 获取线程 ID?

Mac OS X 中的 ldconfig 等效项?

Vim 增量搜索

如何将所有文件从一个目录移动(和覆盖)到另一个目录?

如何自动启动 Solr?