《網路程式設計》路由套接字

2021-06-27 17:08:50 字數 2627 閱讀 8925

unix 系統整合了路由功能,它包含相應的路由資料庫可提供的路由資訊,使用者可以通過命令方式來增加、修改以及刪除路由表中的專案,也可以只檢視路由表的資訊。在建立套接字時,可以通過指定引數 af_route 域建立路由套接字,路由套接字可以訪問核心中路由子系統的介面資訊。路由套接字上支援 3 種型別的操作:

程序通過寫到路由套接字向核心傳送訊息;

程序通過讀入路由套接字接收來自核心的訊息;

程序呼叫 sysctl 函式獲取路由表或列出所有已配置的介面;

struct sockaddr_dl ;

/* 說明:

* 其中 sdl_data成員包含名字和鏈路層位址;名字從sdl_data[0]開始,而且不以空字元結尾;

*/#define lladdr(s) ((caddr_t)((s)->sdl_data + (s)->sdl_nlen))

首先可以指定 af_route 域  socket(af_route,sock_raw,0);建立路由套接字,它只能支援原始套接字,只有超級使用者才能建立這個套接字。建立路由套接字後,與其他套接字一樣,可以呼叫 read() 或 write() 函式進行讀寫,但是由於系統核心是根據應用程式寫入的訊息來完成對路由資訊的提供和修改的,因此,與其他套接字不同,寫入和讀出的資料都是有固定的格式的,例如:為了增加路由訊息型別為rtm_add;為了獲取路由,訊息型別為rtm_get;路由套接字在 裡面定義了相應的訊息型別。具體引數可參照書本上的**。

使用 sysctl 函式可以使不具有超級使用者許可權的程式能夠獲取路由表和介面列表資訊,以下是該函式的定義:

/* 函式功能:檢查路由表和介面列表;

* 返回值:若成功則返回0,若出錯則返回-1;

* 函式原型:

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

/* 說明:

* 引數name是指定名字的乙個整數陣列,namelen是指定該陣列中的元素數目,該陣列中第乙個元素指定請求定向到核心的某個子系統,接下來的元素逐漸細化指定該子系統的某個部分;

* oldp指向提供核心存放值的緩衝區,oldlenp是值-結果引數,即指定緩衝區大小作為引數值輸入,函式返回時,該值結果變為核心存放在該緩衝區的實際大小;

* newp指向乙個為newlen引數值的緩衝區,也可指定為空指標;

* */

/*name 引數的第乙個元素可取以下值:*/

/* top-level names: */

enum

;/* name 引數的第二個元素可取以下值:

* (1)af_inet 獲取或設定影響網際網協議的變數;

* (2)af_link 獲取或設定鏈路層資訊;

* (3)af_route 返回路由表或介面列表資訊;

* (4)af_unspec 獲取或設定一些套接字層變數;

*/ /* 若name陣列的第二個元素指定為af_route時,第三個元素則是0,第四個元素則是乙個位址族,第五個和第六個元素取值如下表; */

每個介面都有唯一的名字和唯一的正值索引。以下是介面名字和索引函式的定義:

/* 介面名字和索引函式 */

#include /* convert an inte***ce name to an index, and vice versa. */

unsigned int if_nametoindex (const char *ifname);/* 若成功則返回正的介面索引,出錯返回0 */

char *if_indextoname (unsigned int ifindex, char *ifname);/* 若成功則返回指向介面名字的指標,出錯則返回null */

/* return a list of all inte***ces and their indices. */

struct if_nameindex *if_nameindex (void);/* 若成功則返回非空指標,出錯則返回null */

/* free the data returned from if_nameindex. */

void if_freenameindex (struct if_nameindex *ptr);

/* 說明:

* if_nametoindex返回名為ifname的介面的索引;

* if_indextoname對給定的ifindex返回乙個指向其介面名的指標,ifname引數指向乙個大小為ifnamsiz標頭檔案中定義的緩衝區,

* 呼叫者必須分配這個緩衝區以儲存結果,成功時這個指標也是函式的返回值;

* if_nameindex返回乙個指向if_nameindex結構的陣列的指標;

*//* 結構體if_nameindex 的定義 */

struct if_nameindex

;/* 結構成員記憶體空間由函式動態獲取,並由函式if_freenameindex歸還給系統 */

網路套接字程式設計

1。位元組序 小位元組 低位儲存在低位元組 大位元組 低位儲存在高位元組 簡單程式判斷 int islittle 2.hostent結構 struct hostent define h addr h addr list 0 這裡是這個資料結構的詳細資料 struct hostent h name 位...

網路程式設計套接字

建立 函式原型 int socket int domain int type int protocol 引數說明 domain 協議域,又稱協議族 family 常用的協議族有af inet af inet6 af local 或稱af unix,unix域socket af route等。協議族決...

網路程式設計套接字

本節重點 本節重點需要掌握的是 基本概念 1.認識ip位址 同樣的問題,整個西天取經過程中,直到ip位址 從長安到西天 只知道這個不能完成取經 需要直到從長安的誰那得到的資訊到西天的誰那拿經 唐太宗 如來佛 有了ip位址 長安 西天 和埠號 唐太宗 如來佛 才能完成取經。引出了下面的埠號的概念。2....