108-网络接口

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.总结

  • 掌握接口的基本概念
  • 接口名称和接口索引