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 檢視接口的索引号。
程式位于路徑
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
還有一對函數(第二個用是釋放資源的),主要用來:
struct if_nameindex *if_nameindex(void);
void if_freenameindex(struct if_nameindex *ptr);
struct if_nameindex {
unsigned int if_index;
char *if_name;
// 其它成員
4.總結
- 掌握接口的基本概念
- 接口名稱和接口索引