自己動手寫路由器之ARP資料報的傳輸

2021-06-20 04:57:09 字數 2638 閱讀 7129

在寫路由器時,涉及到對arp資料報的傳輸和接收!本來我是打算將廣播,傳輸,接收一塊兒寫完之後再來說這塊兒的,但是下午突然就沒心思了,明天開始要休息五天,所以決定先把目前寫了的部分講述一下吧!

我們先來看看arp資料報的結構:

乙個arp資料報為42個位元組,前14個位元組為乙太網首部,後28個位元組為arp請求/應答部分。

在看**之前,我們首先得弄懂,arp資料報的傳輸原理。假設a想b傳送乙個資料報,a並不知道b在**,那麼a首先會發乙個廣播的arp請求,這個網段上的所有計算機(電腦)都會接收到來自a的arp請求,由於每台計算機(電腦)都有自己唯一的mac和ip,那麼它會分析目的ip是不是自己的ip,如果不是,網絡卡會自動丟棄資料報。如果b接收到了,經過分析,目的ip是自己的,於是更新自己的arp快取記憶體,記錄下a的ip和mac。然後b就 會回應a乙個arp應答,就是把a的源ip,源mac變成現在目的ip,和目的mac,再帶上自己的源ip,源mac,傳送給a。當a機接收到arp應答後,更新自己的arp快取記憶體,即把arp應答中的b機的源ip,源mac的對映關係記錄在快取記憶體中。那麼現在a機中有b的mac和ip,b機中也有a的mac和ip。arp請求和應答過程就結束了。

先來看看寫的兩個函式介面吧,詳解請看注釋:

第乙個是arp資料報的傳輸:

1

void sendarp(int sockfd,char *ip)2;

2122

intaim_ip;

23 inet_pton(af_inet, ip, &aim_ip);

24 memcpy(&sendmsg[38],&aim_ip,4); //

待填寫目的ip位址

25 printf("

the aim_ip is %d.%d.%d.%d \n

",sendmsg[38],sendmsg[39],sendmsg[40],sendmsg[41

]);26

27struct sockaddr_ll sll; //

原始套接字位址結構

28struct ifreq ethreq; //

網路介面位址

2930

/*更新自己的arp快取記憶體

*/31

if(send_msg[41]==156)32

37if(send_msg[41]==153)38

4344

//把介面索引存入ethreq.ifr_ifindex

45if( -1 == ioctl(socketfd,siocgifindex,(char *)ðreq))

4650

51 bzero(&sll,sizeof(struct

sockaddr_ll));

52 sll.sll_ifindex =ethreq.ifr_ifindex;

5354

if( -1 == sendto(socketfd, sendmsg, 42, 0 , (struct sockaddr *)&sll, sizeof

(sll)))

5559 }

第二個是廣播arp請求:

1

void brdcast(int

sockfd)2;

2122

inttmpi;

23int

tmpj;

24struct

ifreq ethreq;

25struct

sockaddr_ll sll;

26 tmpj = int getinte***cenumber(); //

這裡的getinte***cenumber()會在下面進行解釋

2728

for(tmpi = 1;tmpi )

2940

41 bzero(&sll,sizeof(struct

sockaddr_ll));

42 sll.sll_ifindex =ethreq.ifr_ifindex;

4344

if( -1 == sendto(socketfd, sendmsg, 42, 0 , (struct sockaddr *)&sll, sizeof

(sll)))

4549}50

return

51 }

在**裡,有出現一些莫名其妙的函式或者結構體,比如net_inte***ce和getinte***cenumber(),net_inte***ce裡儲存的是網路介面裡讀取到的一些資訊,比如ip位址,子網掩碼,mac位址等等,getinte***cenumber()的返回值是接入的數量。這些是在另外的乙個.c裡實現的,我在這裡是直接呼叫的!

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

由於我的這個路由器剛寫沒多久,目前只是寫了部分介面而已,我是寫一點兒記錄一點兒,有些**未經測試我就放上來了,所以若**裡有問題,請指出來,我會進行修改的。當所有工作全部完成之時,我會將整個所編寫的路由器**公布上來的。

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

最近打算寫乙個簡單路由器,裡面有用到ioctl獲取網路介面資訊,那就先把這部分單獨拿出來說一說吧!ioctl這個函式,可以用來對特殊檔案的基礎裝置引數進行操作,它們可以完成與開啟檔案描述符相關聯的控制功能。在程式啟動時獲得主機上所有介面的資訊 介面的位址 介面是否支援廣播 是否支援多播等等。成功返回...

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

最近打算寫乙個簡單路由器,裡面有用到ioctl獲取網路介面資訊,那就先把這部分單獨拿出來說一說吧!ioctl這個函式,可以用來對特殊檔案的基礎裝置引數進行操作,它們可以完成與開啟檔案描述符相關聯的控制功能。在程式啟動時獲得主機上所有介面的資訊 介面的位址 介面是否支援廣播 是否支援多播等等。成功返回...

路由器密碼忘了怎麼辦 自己動手不求人

現在我們正處於網際網路時代,網路讓我們的生活變得更加便利,無論是娛樂 購物 工作等,我們都習慣依賴網際網路進行。尤其是現在移動網際網路的迅速崛起,讓pc機在家庭中的地位一落千丈,智慧型手機 平板電腦等移動端裝置,成為了家庭上網的主力軍。躺在沙發上 蜷在被窩裡 上廁所方便時 我們都在通過家庭網路與外界...