sysctl操作 我們對於路由套接口的主要興趣點在於使用sysctl函數檢查路由表和接口清單。 使用該函數檢查路由表清單不需要超級用戶權限。
#include<sys/param.h> #include<sys/sysctl.h> int sysctl( int *name, u_int namelen, void *oldp, size_t *oldenp, void *newp, size_t newlen ); 返回0:成功 -1:失敗
name參數是指定名字的一個整數數組,namelen參數指定了該數組中的元素數目。該數組 中的第一個元素指定本請求定向到內核的哪個子系統。第二個及其後元素依次細化指定該系 統的某個部分。 爲了獲取某個值,oldp參數指向一個供內核存放該值的緩衝區。oldlenp則是一個值-結果參 數:函數被調用時,oldlenp指向的值指定該緩衝區的大小;函數返回時,該值給出內核存 放在該緩衝區中的數據量。如果這個緩衝不夠大,函數就返回ENOMEM錯誤。作爲特例, Oldp可以是一個空指針,而oldlenp卻是一個非空指針,內核確定這樣的調用應該返回的數據量,並通過oldlenp返回這個大小。 爲了設置某個新值,newp參數指向一個大小爲newlen參數值的緩衝區。如果不準備指定一 個新值,那麼newp應爲一個空指針,newlen因爲0. sysctl的man手冊詳細敘述了該函數可以獲取的各種系統消息,有文件系統,虛擬內存,內 核限制,硬件等各個方面的信息。我們感興趣的是網絡子系統,通過把name數組的第一個 元素設置成CTL_NET來指定。(CTL_XXX常值在<sys/sysctl.h>中定義),第二個元素可以:
AF_INET: 獲取或者設置影響網際協議的變量。下一級爲使用某個IPPROTO_XXX常 值指定的具體協議。 AF_LINK: 獲取或設置鏈路層信息,例如:PPP接口的數目。 AF_ROUTE: 返回路由表或接口清單的信息。 AF_UNSPEC: 獲取或設置一些套接口層變量,例如套接口發送或接收緩衝區的最大大 小
當name數組的第二個元素爲AF_ROUTE時,第三個元素(協議號)總是爲0,第四個元素 是一個地址族,第五個和第六個指定做什麼,如下表所示:
路由域支持三種操作,由name[4]指定。(NET_RT_xxx常值在<sys/socket.h>中定義),這三種操作返回的信息通過sysctl調用中的oldp指針返回。Oldp指向的緩衝區中含有可變數目的RTM_xxx消息。
1 NET_RT_DUMP返回由name[3]指定的地址族的路由表。如果所指定的地址族爲0, 那麼返回所有地址族的路由表。 路由表作爲可變數目的RTM_GET消息返回,每個消息後跟最多4個套接口地址結構: 本路由表項目的地址,網關,網絡掩碼和克隆掩碼。相比直接讀寫路由套接口操作,sysctl 操作所有改動僅僅體現在內核通過後者返回一個或者多個RTM_GET消息。
2 NET_RT_FLAGS返回由name[3]指定的地址族的路由表,但是僅僅限於那些所帶 標誌(若干個RTF_XXX常值的邏輯或)與由name[5]指定的標誌匹配的路由表項。路由表中所有ARP高速緩存均設置了RTF_LLINFO標誌位。這種操作的信息返回格式和上一 種操作的一致。
3 NET_RT_IFLIST返回所有已配置接口的信息。如果name[5]不爲0,它就是某個接口 的索引,於是僅僅返回該接口的信息。已賦予每個接口的所有地址也同時返回。不過如 果name[3]不爲0,那麼僅限於返回指定地址族的地址。 每個接口的返回消息包括一個RTM_IFINFO消息和後跟的多個或零個或多個 RTM_NEWADDR消息。其中每個RTM_NEWADDR消息對應已賦予該接口的一個地址。 接在RTM_IFINFO消息頭部之後的是一個數據鏈路層套接口地址結構,接在每個 RTM_NEWADDR消息頭部之後的這是最多三個套接口地址結構:接口地址,網絡掩碼和
廣播地址。 |