一、获取本机所有可用网卡名
原理:
在 Linux 系统中,/proc 目录是一个位于内存中的伪文件系统。
/proc目录是内核提供给我们的查询中心,通过查询该目录下的文件内容,可以获取到有关系统硬件及当前运行进程的信息,如 CPU 信息、负载信息、系统内存信息、磁盘 IO 信息等。
其中文件: /proc/net/dev
,该文件是内核维护,所有可用的网口均会同步到该文件中。
/proc/net/dev
peng@ubuntu:~$ cat /proc/net/devInter-| 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;}