在linux中,每个网口都有唯一的名字和正值索引,索引号从1开始(并不是0),linux提供了4个接口用于索引和名称之间的映射,定义如下:
#include <net/if.h>
unsigned int if_nametoindex(const char *ifname);
作用:网口名称映射成网口索引
返回值:成功返回索引,失败返回0
char *if_indextoname(unsigned int ifindex, char *ifname);
作用:网口索引映射成名称
返回值:成功返回名字内存的指针,失败返回NULL
struct if_nameindex *if_nameindex(void);
作用:返回所有的名称索引结构体列表
返回值:成功返回非空指针,失败返回NULL
voif if_freenamrindex(struct if_nameindex *ptr);
作用:释放为了记录struct if_nameindex而创建的内存
例子:
#include <net/if.h>
#include <stdio.h>
int
main(int argc, char **argv)
{
char *if_name;
int index;
struct if_nameindex *if_list, *if_one;
if_list = if_nameindex();
index = 0;
for ( ; ((struct if_nameindex *)(if_list + index))->if_index != 0; index++) {
if_one = (struct if_nameindex *)(if_list + index);
printf("%d : %s\n", if_one->if_index, if_one->if_name);
}
if_freenameindex(if_list);
return 0;
}
执行结果,可以看到索引确实从1开始,并且顺序和ip addr show的结果一致:
[root@localhost if_nametoindex]# ./a.out
1 : lo
2 : ens33
3 : ens160
4 : ens192