最近打算寫乙個簡單路由器,裡面有用到ioctl獲取網路介面資訊,那就先把這部分單獨拿出來說一說吧!
ioctl這個函式,可以用來對特殊檔案的基礎裝置引數進行操作,它們可以完成與開啟檔案描述符相關聯的控制功能。在程式啟動時獲得主機上所有介面的資訊: 介面的位址、介面是否支援廣播、是否支援多播等等。成功返回0,出錯則返回-1。
本文裡只是單獨對獲取網路介面資訊部分講解。
先列出一些本文裡ioctl的相關ioctl 請求的request 引數以及arg 位址必須指向的資料型別:
request引數
相關說明
指向資料型別
siocgifconf
獲取所有介面資訊
struct ifconf
siocgifaddr
獲取介面位址
struct ifreq
siocgifflags
獲取介面狀態
struct ifreq
siocgifbrdaddr
獲取廣播位址
struct ifreq
siocgifnetmask
獲取子網掩碼
struct ifreq
接下來,就開始利用ioctl以及其引數來獲取網路介面的資訊了。
直接附上**,詳情請看注釋:
1在驅動程式中實現的ioctl函式體內,實際上是有乙個switch結構的,每乙個case對應乙個命令碼,做出一些相應的操作。intmain()
2 16
if(-1 == ioctl(sockfd,siocgifconf,(char *)&ifc))//
siocgifconf用來獲取所有配置介面的資訊,將所獲取的資訊儲存到ifc裡。
1721
22 number = ifc.ifc_len / sizeof(struct
ifreq);
23 printf("
the inte***ce number is %d \n
",number);
24int
tmp;
25for(tmp = number;tmp > 0;tmp--)26
3738
/*ip位址的獲取
*/39
if(0 == ioctl(sockfd,siocgifaddr,(char *)&buf[tmp]))
40
4445
/*子網掩碼的獲取
*/46
if(0 == ioctl(sockfd,siocgifnetmask,(char *)&buf[tmp]))
47
5152
/*廣播位址的獲取
*/53
if(0 == ioctl(sockfd,siocgifbrdaddr,(char *)&buf[tmp]))54
5859
/*mac位址的獲取
*/60
if(0 == ioctl(sockfd,siocgifhwaddr,(char *)&buf[tmp]))61
70}71 }
ioctl這個函式還有很多其它的功能,有興趣的朋友可以問度娘,這裡就不加詳述了!
出處:
自己動手寫路由器之ioctl獲取網路介面資訊
最近打算寫乙個簡單路由器,裡面有用到ioctl獲取網路介面資訊,那就先把這部分單獨拿出來說一說吧!ioctl這個函式,可以用來對特殊檔案的基礎裝置引數進行操作,它們可以完成與開啟檔案描述符相關聯的控制功能。在程式啟動時獲得主機上所有介面的資訊 介面的位址 介面是否支援廣播 是否支援多播等等。成功返回...
自己動手寫路由器之ARP資料報的傳輸
在寫路由器時,涉及到對arp資料報的傳輸和接收!本來我是打算將廣播,傳輸,接收一塊兒寫完之後再來說這塊兒的,但是下午突然就沒心思了,明天開始要休息五天,所以決定先把目前寫了的部分講述一下吧!我們先來看看arp資料報的結構 乙個arp資料報為42個位元組,前14個位元組為乙太網首部,後28個位元組為a...
自己動手寫docker之cgroup
實驗環境 ubuntu 18.10 作業系統已經預設把各種controller都掛載到 sys fs cgroup 目錄下了。ls sys fs cgroup 可以檢視有哪些controller mount grep cgroup 可以檢視掛載資訊 可以看到有乙個是cgroup2,其它都是cgrou...