一、获取本机所有可用网卡名
原理:
在 Linux 系统中,/proc 目录是一个位于内存中的伪文件系统。
/proc目录是内核提供给我们的查询中心,通过查询该目录下的文件内容,可以获取到有关系统硬件及当前运行进程的信息,如 CPU 信息、负载信息、系统内存信息、磁盘 IO 信息等。
其中文件: /proc/net/dev
,该文件是内核维护,所有可用的网口均会同步到该文件中。
/proc/net/dev
peng@ubuntu:~$ cat /proc/net/dev
Inter-| Receive | Transmitface |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressedlo: 26163 292 0 0 0 0 0 0 26163 292 0 0 0 0 0 0eth0: 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 inif_ioctl.c. */while (fgets (buf, PROCBUFSIZ, fp) != NULL){ p = interface_name_cut (buf, &name);printf("port=%s\n",name);} fclose(fp);return 0;
}