如何以编程方式查找 Linux 中为特定网络设备配置的 IP 地址/网络掩码/网关?
我想编写一段代码来检查每个网络设备(例如 eth0、lo、主设备)有关该设备的一些统计信息和配置数据。
我可以在 /sys/class/net/... 中找到统计数据(以及大部分配置数据),但是,我找不到任何 C/C++ API 或 procfs/sysfs 中列出 inet addr 的任何条目,网络掩码和网关。
我检查了一些替代方案:
- 解析 ifconfig/route/其他一些实用程序的输出:我不想每次需要进行检查时都启动子进程。
- 解析 /etc/sysconfig/network-scripts/: 只会给我启动配置,而不是当前状态。
另外,由于此代码适用于我工作场所中的产品,其中每个外部库都经过彻底检查(这意味着我将花费很长时间来添加任何外部库),因此我更喜欢依赖 Linux 本机 API 而不是外部库的解决方案。
谢谢!
I would like to write a piece of code which checks, for each network device (e.g. eth0, lo, master devices) some statistics and configuration data about that device.
I could find the statistics data (and most of the configuration data) in /sys/class/net/..., however, I couldn't find any C/C++ API or any entry in procfs/sysfs listing the inet addr, netmask and gateway.
Some alternatives I checked:
- parsing the output from ifconfig/route/some other utilities: I don't want to start a subprocess every time I need to do the inspection.
- parsing /etc/sysconfig/network-scripts/: will give me only the start-up configuration, and not the current state.
Also, since this code is intended for a product in my workplace, where every external library is inspected thoroughly (meaning it will take me forever to add any external library) I prefer solutions which rely on Linux native API and not external libraries.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
当然,使用 ifreq 和 ioctl() 调用的结构可以获取所有接口信息:
手册页位于此处 Ifreq manpage
快速编辑,此函数要求在调用之前已分配接口,如下所示:
确保您已分配先记忆,然后像这样调用
There sure is using a struct of ifreq and ioctl() calls you can grab all interface information:
Man page is here Ifreq manpage
Quick edit, this function requires that the interface has been assigned before it is called, like so:
Ensuring you have allocated the memory first, then call like so
通过 strace(在随机的 Linux 机器上)运行 netstat,显示了以下调用顺序:
因此,“秘密”似乎是创建一个套接字,然后执行一堆 ioctl() 操作调用以访问当前信息。
Running netstat through strace (on a random Linux box), reveals the following sequence of calls taking place:
So, the "secret" seems to be to create a socket, then do a bunch of
ioctl()
calls to access the current information.看一下
/usr/include/ifaddrs.h
。为此有一个 GNU 特定的 API。Take a look at
/usr/include/ifaddrs.h
. There is a GNU specific API for this.