自己動手寫路由器之ioctl獲取網路介面資訊

2021-06-20 04:31:37 字數 1668 閱讀 1468

最近打算寫乙個簡單路由器,裡面有用到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

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函式體內,實際上是有乙個switch結構的,每乙個case對應乙個命令碼,做出一些相應的操作。

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...