在寫路由器時,涉及到對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第二個是廣播arp請求: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 }
1在**裡,有出現一些莫名其妙的函式或者結構體,比如net_inte***ce和getinte***cenumber(),net_inte***ce裡儲存的是網路介面裡讀取到的一些資訊,比如ip位址,子網掩碼,mac位址等等,getinte***cenumber()的返回值是接入的數量。這些是在另外的乙個.c裡實現的,我在這裡是直接呼叫的!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 }
自己動手寫路由器之ioctl獲取網路介面資訊
由於我的這個路由器剛寫沒多久,目前只是寫了部分介面而已,我是寫一點兒記錄一點兒,有些**未經測試我就放上來了,所以若**裡有問題,請指出來,我會進行修改的。當所有工作全部完成之時,我會將整個所編寫的路由器**公布上來的。
自己動手寫路由器之ioctl獲取網路介面資訊
最近打算寫乙個簡單路由器,裡面有用到ioctl獲取網路介面資訊,那就先把這部分單獨拿出來說一說吧!ioctl這個函式,可以用來對特殊檔案的基礎裝置引數進行操作,它們可以完成與開啟檔案描述符相關聯的控制功能。在程式啟動時獲得主機上所有介面的資訊 介面的位址 介面是否支援廣播 是否支援多播等等。成功返回...
自己動手寫路由器之ioctl獲取網路介面資訊
最近打算寫乙個簡單路由器,裡面有用到ioctl獲取網路介面資訊,那就先把這部分單獨拿出來說一說吧!ioctl這個函式,可以用來對特殊檔案的基礎裝置引數進行操作,它們可以完成與開啟檔案描述符相關聯的控制功能。在程式啟動時獲得主機上所有介面的資訊 介面的位址 介面是否支援廣播 是否支援多播等等。成功返回...
路由器密碼忘了怎麼辦 自己動手不求人
現在我們正處於網際網路時代,網路讓我們的生活變得更加便利,無論是娛樂 購物 工作等,我們都習慣依賴網際網路進行。尤其是現在移動網際網路的迅速崛起,讓pc機在家庭中的地位一落千丈,智慧型手機 平板電腦等移動端裝置,成為了家庭上網的主力軍。躺在沙發上 蜷在被窩裡 上廁所方便時 我們都在通過家庭網路與外界...