• 简简单单教你如何用C语言实现获取当前所有可用网口!


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

    原理:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    代码原理讲解

    • 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++ = '\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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    运行截图

  • 相关阅读:
    #硬件电路设计VL817-Q7(B0)芯片拓展USB3.0一转四调试心得
    js中的基础知识点 —— 事件
    Linux-0.11 boot目录bootsect.s详解
    《机器学习实战》学习笔记(十四)
    CKA、CKAD、CKS、LFCS、LFCA、LFCE 60$ 刀优惠券
    Ubuntu:解决PyCharm中不能输入中文或者输入一个中文解决方法
    聚观早报 | vivo Y100官宣;极氪001 FR将上市
    测试/开发程序员,30而立,你是否觉得迷茫?又当何去何从......
    JSON Web Tokens攻击漏洞手法
    59 权限提升-Win溢出漏洞及AT&SC&PS提权
  • 原文地址:https://blog.csdn.net/daocaokafei/article/details/132794419