【发布时间】:2011-05-18 18:47:57
【问题描述】:
我想设置 MTU 或获取一些设备详细信息,但我不想使用 系统(“ifconfig ...”)。
有没有办法在 C 中做到这一点?有些像 libifconfig.so?
MTU的源码可以在here找到。
但我现在真的没有太多时间。如何获取所有可用接口的名称(我的系统中有很多)
【问题讨论】:
标签: c linux network-programming
我想设置 MTU 或获取一些设备详细信息,但我不想使用 系统(“ifconfig ...”)。
有没有办法在 C 中做到这一点?有些像 libifconfig.so?
MTU的源码可以在here找到。
但我现在真的没有太多时间。如何获取所有可用接口的名称(我的系统中有很多)
【问题讨论】:
标签: c linux network-programming
可以通过ioctl 完成。见netdevice(7)。我猜SIOCGIFMTU 和SIOCSIFMTU 是你要找的。我不知道它是否是标准的,如果您需要支持其他 Unix,请更新您的问题。
编辑
在您的机器上获取接口(未经测试):
int sock;
struct ifconf *conf;
sock = socket(AF_INET, SOCK_STREAM, 0);
ioctl(sock, SIOCGIFCONF , (char*) conf);
不要马虎,不要忘记检查返回值。我不在这里检查它们,因为我不在乎;你可能会。
【讨论】:
当然有办法用 C 来做。问问自己 ifconfig 是用什么写的?
由于 Linux 是开源的,您可以下载 ifconfig 的源代码并查看它使用的 API。这是我认为最简单的方法。
如果我想亲自查看代码,我可以稍后对其进行编辑以包含 API。
【讨论】:
if_nameindex是获取所有接口列表的函数。
实际上对它们做很多事情依赖于系统特定的ioctl 调用。
老实说,与其浪费时间获取和阅读 100 倍过于复杂的 ifconfig 等遗留资源,不如直接运行 strace ifconfig ... 并查看它正在生成的 ioctl 系统调用。实际上,这是从具有过于复杂的源逻辑或您没有源代码的程序中复制行为的通用方法。
【讨论】:
在我的 debian 机器上我可以
sudo apt-get install iproute{,-dev,-doc}
sudo apt-get build-dep iproute
apt-get source iproute --compile
这将为我提供ip(新的 ifconfig)的源代码、用于构建 iproute 扩展的文档和开发标头。哦,源代码已经编译好了:)
通过/usr/share/doc/iproute-do 访问文档(examples/ 看起来很有趣)。
【讨论】: