在路由器介面中支援三種型別的操作
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...