簡單路由程序?qū)嶒瀳蟾鎋第1頁
簡單路由程序?qū)嶒瀳蟾鎋第2頁
簡單路由程序?qū)嶒瀳蟾鎋第3頁
簡單路由程序?qū)嶒瀳蟾鎋第4頁
簡單路由程序?qū)嶒瀳蟾鎋第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、姓名:# 學號:# 專業(yè):計算機科學與技術(shù)簡單的路由程序設(shè)計實驗報告姓名:#學號:#專業(yè):計算機科學與技術(shù)完成日期:2014/6/4目錄 TOC o 1-3 h z u HYPERLINK l _Toc389738459 實驗環(huán)境 PAGEREF _Toc389738459 h 3 HYPERLINK l _Toc389738460 簡單的路由程序設(shè)計 PAGEREF _Toc389738460 h 3 HYPERLINK l _Toc389738461 路由軟件應(yīng)該處理的主要內(nèi)容 PAGEREF _Toc389738461 h 3 HYPERLINK l _Toc389738462 程序運行

2、流程圖解 PAGEREF _Toc389738462 h 4 HYPERLINK l _Toc389738463 程序代碼詳解 PAGEREF _Toc389738463 h 6 HYPERLINK l _Toc389738464 路由表處理函數(shù): PAGEREF _Toc389738464 h 6 HYPERLINK l _Toc389738465 初始化操作 PAGEREF _Toc389738465 h 8 HYPERLINK l _Toc389738466 路由表操作: PAGEREF _Toc389738466 h 9 HYPERLINK l _Toc389738467 數(shù)據(jù)報的捕獲

3、與轉(zhuǎn)發(fā) PAGEREF _Toc389738467 h 12 HYPERLINK l _Toc389738468 實驗結(jié)果 PAGEREF _Toc389738468 h 17 HYPERLINK l _Toc389738469 實驗總結(jié)與心得體會 PAGEREF _Toc389738469 h 18 HYPERLINK l _Toc389738470 實驗中遇到的困難 PAGEREF _Toc389738470 h 18 HYPERLINK l _Toc389738471 實驗心得 PAGEREF _Toc389738471 h 19實驗環(huán)境本實驗要求用VC編寫簡單路由程序,實現(xiàn)IP數(shù)據(jù)包的

4、轉(zhuǎn)發(fā)。在局域網(wǎng)中進行調(diào)試,實驗使用的以太網(wǎng)可以是共享式以太網(wǎng)也可以是交換式以太網(wǎng)。實驗環(huán)境如下圖所示。路由R1、R2運行自主編寫的路由程序,綁定雙IP,通過路由程序添加路由表,對接收的數(shù)據(jù)包進行分析和轉(zhuǎn)發(fā),實現(xiàn)處于不同網(wǎng)絡(luò)中的主機I和II的相互通信。通信測試由ping命令執(zhí)行,可以通過tracer +IP地址 來追蹤數(shù)據(jù)包在網(wǎng)絡(luò)中的轉(zhuǎn)發(fā)路徑。簡單的路由程序設(shè)計路由軟件應(yīng)該處理的主要內(nèi)容編制一個較為完整的路由軟件相當復(fù)雜包含如下工作:為經(jīng)過的IP 數(shù)據(jù)報選擇路由:路由器基本功能,對接受的IP數(shù)據(jù)報提取目的IP地址,根據(jù)自己的路由表信息為該數(shù)據(jù)報選擇最優(yōu)的轉(zhuǎn)發(fā)路徑。處理IP 數(shù)據(jù)報的TTL域中的數(shù)

5、值,拋棄TTLnext=NULL;router_size+;return true;if(router_size=1) rc-next=new router_chart;memcpy(rc-next,addroute,sizeof(struct router_chart);rc-next-next=NULL;router_size+;return true;router_chart *temp;for(temp=rc;temp-next!=NULL;temp=temp-next)if(temp-desnet=addroute-desnet)&(temp-netmask=addroute-net

6、mask)return false;/重復(fù)添加temp-next=new router_chart;memcpy(temp-next,addroute,sizeof(struct router_chart);router_size+;temp-next-next=NULL;return true;-編輯路由表選項:BOOL edit_route(router_chart *rc,int choice,router_chart *editroute)if(router_size=0|choicerouter_size)return false;router_chart *temp;temp=rc

7、;if(choice=1)temp=rc-next;memcpy(rc,editroute,sizeof(struct router_chart);rc-next=temp;return true;for(int i=2;temp;temp=temp-next)if(i=choice)memcpy(temp-next,editroute,sizeof(struct router_chart);/*temp-desnet=editroute-desnet;temp-netmask=editroute-netmask;temp-NextHop=editroute-NextHop;*/return

8、true;return false;-刪除路由表選項:BOOL del_route(router_chart *rc,int choice)if(router_size=0|choicerouter_size)return false;router_chart *temp;temp=rc;if (choice=1)rc=rc-next;for(int i=2;temp;i+,temp=temp-next)if(i=choice)temp-next=temp-next-next;router_size-;return true;return false;/路由表中不存在所選項-匹配路由表選項:U

9、LONG match(router_chart *rc, ULONG desIP)ULONG N_Hop=-1;router_chart *temp;temp=rc;ULONG longest=0;for(;temp;temp=temp-next)if(temp-netmask&desIP)=temp-desnet)if(temp-netmask=longest)longest=temp-netmask;N_Hop=temp-NextHop;if(N_Hop=-1)return 0 xffffffff;/沒有匹配項elsereturn N_Hop;初始化操作獲得計算機上的設(shè)備列表,選擇一個設(shè)備

10、進行偵聽,利用虛假地址請求本地MAC地址。此為第二次實驗內(nèi)容,代碼相同,不再列出。添加默認路由,網(wǎng)絡(luò)和子網(wǎng)掩碼為本機所處的環(huán)境,下一跳步為“直接投遞”。/添加投遞本地的路由選項for(a=Dev_addr;a!=NULL;a=a-next)coutadding!addr-sa_family=AF_INET)/是否IP地址ULONG r_netmask,r_desnet,r_nexthop;r_netmask=IfInfo.IPMask;r_desnet=(IfInfo.IPAddrtest2)&IfInfo.IPMask;/網(wǎng)絡(luò)地址=IP地址&子網(wǎng)掩碼test2+;r_nexthop=0;/本

11、路由所在網(wǎng)絡(luò),直接投遞數(shù)據(jù)報router_chart *rc_ini;rc_ini=new router_chart;rc_ini-netmask=r_netmask;rc_ini-desnet=r_desnet;rc_ini-NextHop=r_nexthop;if(add_route(rc,rc_ini)coutYou have successfully insert the first route item!n;foutrc.close();flush_rctxt(rc);/將數(shù)據(jù)緩沖到router_chart.txt文檔中foutrc.open(router_chart.txt,ios

12、:out|ios:app);elsecoutError occurs in the initial router_chart insertion.n;pcap_freealldevs(alldevs);路由表操作:提示用戶是否要對路由表進行操作,可以進行的操作為増、刪、改。每次修改后會顯示路由表。char goon;router_chart *temprc;temprc=new router_chart;doint tempi=1;coutnext)couttempinetmask);t2=htonl(temprc-desnet);t3=htonl(temprc-NextHop);memcpy

13、(&addr_temp,&t1,4);coutinet_ntoa(addr_temp)t;memcpy(&addr_temp,&t2,4);coutinet_ntoa(addr_temp)tt;memcpy(&addr_temp,&t3,4);coutinet_ntoa(addr_temp)n;tempi+;coutDo you want to edit the router chart?(Y or y or yes,others for no)n;cout(a for add,e for edit,d for delete, others for quit)n;couteditrc;if(e

14、ditrc=a|editrc=e)ULONG NM,DN,NH;int edit;char cnm16,cdn16,cnh16;if(editrc=e)docoutedit;while(edit=router_size);docoutcnm;NM=(htonl)(inet_addr(cnm);while(NM=INADDR_NONE);docoutcdn;DN=(htonl)(inet_addr(cdn);while(DN=INADDR_NONE);docoutcnh;NH=(htonl)(inet_addr(cnh);while(NH=INADDR_NONE);router_chart *t

15、emprc2;temprc2=new router_chart;temprc2-desnet=DN;temprc2-netmask=NM;temprc2-NextHop=NH;in_addr addr_temp;if(editrc=a)if(add_route(rc,temprc2)t1=htonl(temprc2-netmask);t2=htonl(temprc2-desnet);t3=htonl(temprc2-NextHop);foutrcrouter_size:;memcpy(&addr_temp,&t1,4);foutrcinet_ntoa(addr_temp)t;memcpy(&a

16、ddr_temp,&t2,4);foutrcinet_ntoa(addr_temp)tt;memcpy(&addr_temp,&t3,4);foutrcinet_ntoa(addr_temp)n;coutCongraduation! You have just add a route item.;coutPlease check the router_chart.txtn;elsecoutError occurs in the addition!n;elseif(edit_route(rc,edit,temprc)foutrc.close();flush_rctxt(rc);foutrc.op

17、en(router_chart.txt,ios:out|ios:app);else coutError occurs in the edition!n;else if(editrc=d)int del;docoutdel;while(del=router_size);if(del_route(rc,del)foutrc.close();flush_rctxt(rc);foutrc.open(router_chart.txt,ios:out|ios:app);else coutError occurs in the deletion!n;coutgoon;while(goon=Y|goon=y)

18、;數(shù)據(jù)報的捕獲與轉(zhuǎn)發(fā)根據(jù)流程圖,首先篩選出目的IP不是本機IP,目的MAC是本機MAC的IP數(shù)據(jù)報,將其源MAC改為本機MAC,目的MAC 改為下一跳步MAC,TTL值減一,重新計算校驗和,然后整理數(shù)據(jù)報轉(zhuǎn)發(fā)出去。此操作為一個無限循環(huán),一旦進入則不斷捕獲數(shù)據(jù)報并對符合條件的數(shù)據(jù)報進行操作。do/編譯過濾規(guī)則filter=ip;if(pcap_compile(IfInfo.adhandle,&fcode,filter,1,IfInfo.IPMask)0)coutFail to compile the filtering expression,please check your filtering

19、 expression syntax!n;cout*ERROR in opening interface!*endl;/設(shè)置過濾規(guī)則if(pcap_setfilter(IfInfo.adhandle,&fcode)0)coutFail to set the filter!n;cout*ERROR in opening interface!*endl;/*/pcap_rtn=pcap_next_ex(IfInfo.adhandle,&pkt_header,&pkt_data);IPPacket = (Data_t *)pkt_data; if(pcap_rtn=1) cout*Successfu

20、lly capturing data packet!*FrameHeader.FrameType)=0 x0800)&(memcmp(IPPacket-FrameHeader.DesMAC),IfInfo.MACAddr,6)=0)/00)/為IP 數(shù)據(jù)報u_char *SendIPPacket;int plen=pkt_header-len+sizeof(FrameHeader_t);SendIPPacket=new u_charplen;memcpy(SendIPPacket,pkt_data,plen);/ULONG len;ULONG next_hop;/請求的IP 和由ARP 獲得該

21、IP 的MAC地址UCHAR ReqMAC6;ULONG ReqIP;foutlog.open(routerlog.txt,ios:out|ios:app);foutrc.open(router_chart.txt,ios:out|ios:app);WORD RecvChecksum = IPPacket-IPHeader.Checksum;BYTE *desmac =(IPPacket-FrameHeader.DesMAC);BYTE *srcmac =(IPPacket-FrameHeader.SrcMAC);u_short frametype =(ntohs(IPPacket-Frame

22、Header.FrameType);int ttl =IPPacket-IPHeader.TTL;ULONG src_ip=ntohl(IPPacket-IPHeader.SrcIP);ULONG des_ip=ntohl(IPPacket-IPHeader.DstIP);if(des_ip!=IfInfo.IPAddr0&des_ip!=IfInfo.IPAddr1)/目的MAC地址為本地,但是目的IP不是本地coutntest!n;/SendIPPacket=(Data_t *)pkt_data;cout*Successfully recieved an IPPacket :;foutlo

23、gIPHeader.SrcIP;des_ipaddr.S_un.S_addr=IPPacket-IPHeader.DstIP;src_ip=inet_ntoa(src_ipaddr);des_ip=inet_ntoa(des_ipaddr);coutDesIP &src_ip&des_ipDesMAC ;foutlogDesIP &src_ip&des_ipDesMAC ;mac_out(srcmac);cout;foutlog;mac_out(desmac);if(ttl=0)coutnThe IPPacket has reached its due time(TTL=1), throwin

24、g!;foutlognThe IPPacket has reached its due time(TTLIPHeader.DstIP);des_ipaddr.S_un.S_addr=htonl(next_hop);des_ip=inet_ntoa(des_ipaddr);coutnnextHop: des_ipendl;couthexnext_hopdecendl;if(next_hop=0 xffffffff)/匹配失敗coutn*Failed to match any router chart item!;foutlogIPHeader.DstIP);coutn*Successully f

25、ind the match router chart item, the NextHop is: inet_ntoa(addr_temp) (Direct deliver!);foutlogn*Successully find the match router chart item, the NextHop is: inet_ntoa(addr_temp) (Direct deliver!);elseReqIP=next_hop;coutn*Successully find the match router chart item, the NextHop is: inet_ntoa(addr_

26、temp);foutlogn*Successully find the match router chart item, the NextHop is: inet_ntoa(addr_temp);int ip_addr=0;if(ReqIP&IfInfo.IPMask)=IfInfo.IPAddr1)ip_addr=1;int trycont=1;bool flag=false;/確認是否找到需要的ARP數(shù)據(jù)報while(true)/編譯過濾規(guī)則filter=arp;if(pcap_compile(IfInfo.adhandle,&fcode,filter,1,IfInfo.IPMask)0)

27、coutFail to compile the filtering expression,please check your filtering expression syntax!n;cout*ERROR in opening interface!*endl;/設(shè)置過濾規(guī)則if(pcap_setfilter(IfInfo.adhandle,&fcode)0)coutFail to set the filter!n;cout*ERROR in opening interface!*Operation)=0 x0002)/為ARP應(yīng)答報文if(ntohl(RecvARPFrame-SendIP)

28、=(ReqIP)/為請求的地址memcpy(ReqMAC,RecvARPFrame-SendHa,6);/獲得Mac地址flag=true;break;if(flag)break;addr_temp.S_un.S_addr=ntohl(ReqIP);coutn*ARP Request successed! ;foutlogn*ARP Request successed! ;coutnIP address:inet_ntoa(addr_temp);foutlognIP address:inet_ntoa(addr_temp);cout MAC address:;foutlogMAC addres

29、s:;mac_out(ReqMAC);coutn*endl;coutnDelivering the IPPackete:;foutlogFrameHeader.DesMAC,ReqMAC,6);memcpy(IPPacket-FrameHeader.SrcMAC,IfInfo.MACAddr,6);IPPacket-IPHeader.TTL-;/生存時間減1WORD ip0=MAKEWORD(IPPacket-IPHeader.Ver_HLen,IPPacket-IPHeader.TOS);WORD ip1=IPPacket-IPHeader.TotalLen;WORD ip2=IPPacke

30、t-IPHeader.ID;WORD ip3=IPPacket-IPHeader.Flag_Segment;WORD ip4=MAKEWORD(IPPacket-IPHeader.TTL,IPPacket-IPHeader.Protocol);WORD ip5=0;WORD ip6=HIWORD(IPPacket-IPHeader.SrcIP);WORD ip7=LOWORD(IPPacket-IPHeader.SrcIP);WORD ip8=HIWORD(IPPacket-IPHeader.DstIP);WORD ip9=LOWORD(IPPacket-IPHeader.DstIP);WOR

31、D IP10=ip0,ip1,ip2,ip3,ip4,ip5,ip6,ip7,ip8,ip9;/*校驗和函數(shù)*/WORD ReChecksum;unsigned long cksum=0;for(i=0;i16)+(cksum&0 xffff);cksum+=(cksum16);ReChecksum=cksum;IPPacket-IPHeader.Checksum=ReChecksum;/重新置校驗和/記錄轉(zhuǎn)發(fā)內(nèi)容/in_addr src_ipaddr,des_ipaddr;/char *src_ip,*des_ip;src_ipaddr.S_un.S_addr=IPPacket-IPHeader.SrcIP;des_ipaddr.S_un.S_addr=IPPacket-IPHeader.DstIP;src_ip=inet_n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論