良许Linux教程网 干货合集 简简单单教你如何用C语言列举当前所有网口!

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

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

背景与原理:

Linux系统中,/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

代码实现原理如下:

image-20240418212653794
image-20240418212653794
  • 函数strrchr()

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

二、核心代码如下:

#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++ = '\0';
  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 error\n");
      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=%s\n",name);
    }   
  fclose(fp);
  return 0;
}

运行截图

image-20240418212648042
image-20240418212648042

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部