UNPv1第十七章 路由套介面

2021-07-11 10:54:26 字數 2324 閱讀 5021

在路由器介面中支援三種型別的操作

1). 程序能通過寫路由套介面向核心發訊息。

2). 程序能在路由套介面上從核心讀訊息,這是核心通知程序已收到乙個icmp重定向訊息並進行了處理的方式。

3). 程序可以用sysctl函式得到路由表或列出所有已配置的介面。

在路由套介面上返回的一些訊息中包含資料鏈路套介面位址結構,他在

 uint8_t sdl_len;

 sa_family_t sdl_family; /* af_link */

 uint16_t sdl_index; /* system assigned index, if > 0 */

 uint8_t sdl_type; /* ift_ether, etc. from

*/ uint8_t sdl_nlen; /* name

length, starting in sdl_data[0] */

 uint8_t sdl_alen; /* link-layer address length */

 uint8_t sdl_slen; /* link-layer selector length */

 char sdl_data[12]; /* minimum work area, can be larger;contains

ifname

and link-layer address */};

每個介面都有乙個唯一的大於0的索引號。sdl_data成員包含名字和鏈路層位址,名字從sdl_data[0]開始,而且不以空字元終止。鏈路層位址從名字後面的sdl_nlen位元組開始。這些套介面位址結構是可變長度的。

我們對於路由套介面的主要興趣點在於使用sysctl函式檢查路由表和介面清單,使用該函式檢查路由表清單不需要超級使用者許可權。

#include 

#include

int sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen);

//返回:若成功為0,若出錯-1

這個函式使用類似snmp(簡單網路管理協議)mib(管理資訊庫)的名字

引數name是指定名字的乙個整數陣列,namelen是陣列中的元素數目。陣列的第乙個元素指明請求被發往核心的哪個子系統

第二個引數指明這個子系統的某個部分,依次類推。

要取乙個值,oldp需指向乙個緩衝區,以讓核心存放該值。

oldlenp是乙個值-結果引數:呼叫函式時oldlenp指向的值是緩衝區的大小,返回的值是核心在緩衝區中返回的資料量,如果緩衝區不夠大,就返回enomem錯誤。作為乙個特例,oldp可以是乙個空指標而oldlenp是乙個非空指標,核心確定這個呼叫本應返回的資料量,並通過oldlenp返回這個值。

要設定乙個新值,newp需指向乙個大小為newlen的緩衝區,如果沒有指定新值,newp應為乙個空指標,newlen應為0

下面四個函式用於需要描述乙個解耦的場合,這裡存在乙個概念,即每個介面都有乙個唯一的名字和乙個唯一的正值索引(0從不用做索引)

#include 

unsigned

int if_nametoindex(const

char * ifname);

// 返回:成功時為正的介面索引,出錯時為0

char * if_indextoname(unsigned

int ifindex, char * ifname);

// 返回: 成功時為指向介面名的指標,出錯時為null

struct if_nameindex * if_nameindex(void);

//返回: 成功時為非空指標,出錯時為null

void if_freenameindex(struct if_nameindex * ptr);

if_nametoindex返回名為ifname的介面的索引,if_indextoname對給定的ifindex返回乙個指向其介面名的指標,ifname引數指向乙個大小為ifnamsiz標頭檔案中定義的緩衝區,呼叫者必須分配這個緩衝區以儲存結果,成功時這個指標也是函式的返回值,if_nameindex返回乙個指向if_nameindex結構的陣列的指標

struct if_nameindex;
陣列的最後一項是乙個index為0,if_name為空指標的結構。這個陣列和陣列中各元素指向的名字所用的記憶體是動態分配的,呼叫if_freenameindex可釋放這些記憶體

第十七章 Size Classes

通常,您希望應用程式的介面根據螢幕的尺寸和方向而顯示不同的布局。在本章中,您將修改homepwner中的detailviewcontroller的介面,以便當它出現在具有相對較小高度的螢幕上時,文字字段集合和影象檢視併排而不是堆疊在一起 圖17.1 圖17.1 homepwner 的 detailv...

第十七章 部署

總的來說,部署遇到了許多坑,而且還有好多坑還沒有踩。去cocode找了許多教程,才踩了一些坑,但是關於資料庫的坑,先留著。所有的db.session.add 後面都加上db.session.commit 才行。記得,這是狗書的問題!部署教程 每次修改後需要一下命令重新部署下 git add git ...

第十七章 包

1 如果a資料夾所在目錄在環境變數,a資料夾中的 ma 模組可以被以下方式匯入 import a.ma form a import ma 2 如果 a 資料夾所在目錄在環境變數,a 資料夾中的 b 資料夾的 mb 模組可以被以下方式匯入 import a b mb from a.b import m...