简简单单教你如何用C语言列举当前所有网口!

💡 原文中文,约1700字,阅读约需5分钟。
📝

内容提要

在Linux系统中,通过查询/proc/net/dev文件可以获取到所有可用的网口名称。通过函数interface_name_cut()可以提取出每一行字符串中的网口名信息。代码实现如下:打开/proc/net/dev文件,跳过头部行,然后循环读取每一行,调用interface_name_cut()函数提取网口名信息并打印。

🔎

延伸解读

为什么选择 /proc/net/dev 而不是其他方式

文章指出 /proc 是内核在内存中维护的伪文件系统,/proc/net/dev 会同步所有可用网口。相比调用 ioctl 或 netlink 等接口,直接读取该文件实现简单,无需特殊权限,适合快速获取网口名称列表。但需注意,该文件内容格式固定,解析时需跳过前两行头部信息。

解析网口名称的关键技巧

代码中 interface_name_cut() 先跳过行首空格,再用 strrchr() 找到最后一个冒号,将其替换为字符串结束符,从而截取出冒号前的网口名。这种方法能正确处理 lo、eth0 等常见名称,但若网口名本身包含冒号(Linux 允许),则可能截取错误。

代码的局限与使用注意

示例代码仅打印网口名,未处理文件打开失败以外的错误,且缓冲区大小固定为 PROCBUFSIZ。实际使用时,若网口数量极多或名称超长,可能需调整缓冲区。此外,/proc/net/dev 只列出当前存在的网口,无法获取已禁用或未加载驱动的网口信息。

❓

Q&A

如何在Linux系统中获取所有可用的网口名称?

可以通过查询/proc/net/dev文件来获取所有可用的网口名称。

/proc/net/dev文件的作用是什么?

/proc/net/dev文件是内核维护的,包含所有可用网口的信息。

list_interface_valid()函数的功能是什么?

list_interface_valid()函数用于列举所有可用的网口。

interface_name_cut()函数是如何工作的?

interface_name_cut()函数提取从文件中读取的每一行字符串的网口名信息。

在代码中如何处理文件的头部行?

代码中通过调用fgets()函数跳过头部行。

strrchr()函数的作用是什么?

strrchr()函数返回字符串中最后一个出现的字符位置的指针。

🏷️

标签

➡️

继续阅读