首页 > 其他分享 >简简单单教你如何用C语言实现获取当前所有可用网口!

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

时间:2023-09-12 20:00:09浏览次数:31  
标签:fp name buf 简简单单 C语言 char 网口 interface proc

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

原理:

在 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++ = '\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;
}

运行截图

标签:fp,name,buf,简简单单,C语言,char,网口,interface,proc
From: https://www.cnblogs.com/yikoulinux/p/17697683.html

相关文章

  • 什么是指针c语言中
    c语言指针自己的看法;因为c语言是面向过程的一门语言和java有所不同(因为之前我就是学的Java),简单来说指针是什么呢,我们都知道,每个变量都有一个,是内存自动分配,java也一样,而c语言的指针是指向内存的地址,具体代码的实现p=&var就相当于取出var的地址保存到p中 那指针有什么......
  • C语言 内存布局
    GCC编译预处理->编译->汇编->链接预处理:头⽂件包含、宏替换、条件编译、删除注释...编译:主要进⾏词法、语法、语义分析等,检查⽆误后将预处理好的⽂件编译成汇编⽂件...汇编:将汇编⽂件转换成⼆进制⽬标⽂件...链接:将项⽬中的各个⼆进制⽂件+所需的库+启动代码链接成可执⾏⽂......
  • c语言之memset的初次小练
    //memset--memoryset内存设置//memset(void*ptr,intvalue,size_tnum);//翻译过来就是memset(一个地址,一个你想要将地址中的原有值改为该值,该地址中从左往右的原有的值的数)#include<stdio.h>#include<string.h>intmain(){ chararr[]="helloworld"; memset(arr,......
  • 复习课程1 初始C语言
    学习目标:了解C语言的基础知识与语法,对C语言有一定的认知在初识过程中只是做一个大概的讲解,不做深入的讲解知道了以上的目标后那就让我们开始吧!一.导入我们知道人与人交流是靠语言,我们常见的语言有英文,中文,日文等等,那么人与计算机交流还是靠我们日常生活中所说的人类语言吗?其实不是......
  • C语言 extern 关键字
    注意函数内部定义变量intg_x,g_y;和externg_x,g_y是完全不一样的,前面是局部变量,后面是已经定义好的外部全局变量,这里是引用外部全局变量。#include"stdio.h"#include"stdlib.h"#include"utils.h"#include"gnu/libc-version.h"voidmain_test(void){printf(......
  • C语言练习
    声明#include<stdio.h>#include<string.h>#include<windows.h>#include<stdlib.h>//判断一个数是否为奇数//输出1-100之间的奇数第一种:intmain(){inti=0;printf("Oddnumbersbetween1and100are:\n",i);while(i<=100){......
  • 教你快速了解C语言中的作用域和常量
    (章节目录)前言  哈喽,各位铁汁们好啊!✨今天来给大家带来的是初识C语言里面的作用域、常量。  这几章主要带大家简单认识-一下C语言,俗话说没吃过猪肉,也见过猪跑。带大家了解下C语言。可以读懂C语言的简单程序,后期会给大家详细介绍C语言。一、变量作用域和生命周期作用域......
  • 我个人学习C语言的近期规划
    一.困难点最近我发现学习C语言已经变得越发的困难,接下来我说一下主要的困难点1.学习时很多前面用到的知识点已经遗忘,需要通过重复学习和看笔记才能勉强理解2.写代码时候逻辑经常出现混乱,会写出很多的bug3.困难点(对我来说)第一个就是从函数的递归开始代码很难进行构思,多次递归后就会......
  • C语言中几种类型所占字节数
    类型16位32位64位char111shortint222int244unsignedint244float444double888long448longlong888unsignedlong448......
  • C语言宏定义中的#和##(转)
    https://www.jb51.net/article/282832.htm #和##是宏定义中常用的两个预处理运算符1.记号串化(#)2.记号黏结(##)3. 分析下列程序运行结果#和##是宏定义中常用的两个预处理运算符其中#用于记号串化,##用于记号黏结,下面分别介绍它们。1.记号串化(#)记号串化可以......