1. 接口
网卡,是让计算机通向外部世界的一扇大门。但是在计算机的世界里,一般这扇门称为“接口(Interface)”。接口是物理意义上的设备。
在 Linux/Unix 中,我们使用 ifconfig
命令来查看接口信息:
图1 接口信息
接口通常都有自己的属性,比如在图1 中我们可以看到:
- 有自己的名字,比如 ens33, lo, virbr0.
- 有一些标志位,比如 UP, BROADCAST, RUNNING, MULTICAST 等等。
- 有 ip 地址,子网掩码,广播地址
- 有物理地址,比如 ether 00:0c:29:03:40:40
- …
2. 接口名称与接口索引号
每个接口都有自己的名字,比如图 1 中三个接口名字分别是 ens33, lo, virbr0.
除了 ifconfig 中列举的属性外,接口还有自己的编号,也称为接口索引号(interface index)。
程序 if_nametoindex 能帮我们根据接口名字查看接口对应的索引号:
图2 查看接口的索引号。
该程序托管在 http://git.oschina.net/ivan_allen/unp 上,程序位于路径unp/program/test/interface
下.
程序 if_indextoname 能帮我们根据接口索引号查看接口对应的名字:
图3 查看接口名称
从图 3 可以看到,接口 0 是不存在的。写程序的时候,通常用 0 来表示不存在的接口。
3. 相关函数
图 2 和图 3 中的程序就是使用下面这两个函数实现的,使用起来相当简单。当然代码我就不贴出来了,你可以自己去 unp/program/test/interface
路径下查看源代码。
unsigned int if_nametoindex(const char *ifname); char *if_indextoname(unsigned int ifindex, char *ifname);
还有一对函数(第二个用是释放资源的),主要用来:
struct if_nameindex *if_nameindex(void); void if_freenameindex(struct if_nameindex *ptr);
其中 struct if_nameindex 至少包含两个成员:
struct if_nameindex { unsigned int if_index; char *if_name; // 其它成员 }
if_nameindex 函数返回一个数组,该数组最后一个元素是 NULL.
4.总结
- 掌握接口的基本概念
- 接口名称和接口索引