• 正文
  • 推荐器件
  • 相关推荐
申请入驻 产业图谱

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

2023/09/12
815
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、获取本机所有可用网卡名

原理:

Linux 系统中,/proc 目录是一个位于内存中的伪文件系统。

/proc目录是内核提供给我们的查询中心,通过查询该目录下的文件内容,可以获取到有关系统硬件及当前运行进程的信息,如 CPU 信息、负载信息、系统内存信息、磁盘 IO 信息等。

其中文件:/proc/net/dev ,该文件是内核维护,所有可用的网口均会同步到该文件中。

/proc/net/dev

peng@ubuntu:~$?cat?/proc/net/dev
Inter-|???Receive????????????????????????????????????????????????|??Transmit
?face?|bytes????packets?errs?drop?fifo?frame?compressed?multicast|bytes????packets?errs?drop?fifo?colls?carrier?compressed
????lo:???26163?????292????0????0????0?????0??????????0?????????0????26163?????292????0????0????0?????0???????0??????????0
??eth0:?285444708??243273????0????0????0?????0??????????0?????????0?91828270???88660????0????0????0?????0???????0??????????0

所以我们要列举出所有可用的网口名称,可以通过查看改文件来实现,

代码原理讲解

    list_interface_valid()

该函数用于列举所有可用的网口

    • interface_name_cut (char *buf, char **name)

 

    • 该函数用于将从文件

/proc/net/dev

    中国读取的每一行字符串信息,提取出网口名信息,如lo、eth0

代码实现原理如下:

    函数strrchr()

该函数返回一个指针,指向字符串s中最后一个出现的字符c位置。

二、核心代码如下:

#define?IP_SIZE?128

#define?PROCBUFSIZ??????????????????1024
#define?_PATH_PROC_NET_DEV????????"/proc/net/dev"
static?char?*?interface_name_cut?(char?*buf,?char?**name)
{
??char?*stat;
??/*?Skip?white?space.??Line?will?include?header?spaces.?*/
??while?(*buf?==?'?')
????buf++;
??*name?=?buf;
??/*?Cut?interface?name.?*/
??stat?=?strrchr?(buf,?':');
??*stat++?=?'';
??return?stat;
}

int?list_interface_valid()
{
??FILE?*fp;
??char?buf[PROCBUFSIZ];
??struct?interface?*ifp;
??char?*name;
??char?*p;
?
??/*?Open?/proc/net/dev.?*/
??fp?=?fopen?(_PATH_PROC_NET_DEV,?"r");
??if?(fp?==?NULL)
????{???
????????printf("open?proc?file?errorn");
??????return?-1;?
????}???
?
??/*?Drop?header?lines.?*/
??fgets?(buf,?PROCBUFSIZ,?fp);
??fgets?(buf,?PROCBUFSIZ,?fp);
?
??/*?Only?allocate?interface?structure.??Other?jobs?will?be?done?in
?????if_ioctl.c.?*/
??while?(fgets?(buf,?PROCBUFSIZ,?fp)?!=?NULL)
????{???
??????p?=?interface_name_cut?(buf,?&name);
???printf("port=%sn",name);
????}???
??fclose(fp);
??return?0;
}

运行截图


完整代码获取,【一口Linux】公众号后台回复:eth

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
ABCU-5730RZ 1 Avago Technologies FIBER OPTIC TRANSCEIVER, 1250Mbps(Tx), 1250Mbps(Rx), PANEL MOUNT, RJ-45 CONNECTOR, ROHS COMPLIANT, METAL, PACKAGE-20
暂无数据 查看
AT28C64B-15JU 1 Atmel Corporation EEPROM, 8KX8, 150ns, Parallel, CMOS, PQCC32, GREEN, PLASTIC, MS-016AE, LCC-32

ECAD模型

下载ECAD模型
$4.45 查看
C30617BFCH 1 PerkinElmer Inc Fiber Optic Device
暂无数据 查看

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

公众号『一口Linux』号主彭老师,拥有15年嵌入式开发经验和培训经验。曾任职ZTE,某研究所,华清远见教学总监。拥有多篇网络协议相关专利和软件著作。精通计算机网络、Linux系统编程、ARM、Linux驱动、龙芯、物联网。原创内容基本从实际项目出发,保持原理+实践风格,适合Linux驱动新手入门和技术进阶。