加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 一、获取本机所有可用网卡名
    • 二、核心代码如下:
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

2023/09/12
1811
阅读需 7 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

原理:

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模型 风险等级 参考价格 更多信息
TLP291(GB-TP,SE 1 Toshiba America Electronic Components OPTOISOLATOR 3.75KV TRANS 4-SO

ECAD模型

下载ECAD模型
$0.1 查看
HFBR-1412TZ 1 Foxconn Transmitter, 792nm Min, 865nm Max, 5Mbps, ST Connector, DIP, Panel Mount, Through Hole Mount, ROHS COMPLIANT PACKAGE
$24 查看
CM200C32.768KDZF-UT 1 Citizen Finedevice Co Ltd Parallel - Fundamental Quartz Crystal, 0.032768MHz Nom, ROHS COMPLIANT, PLASTIC, SMD, 4 PIN
$1.17 查看

相关推荐

电子产业图谱

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