




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、姓名:# 學(xué)號(hào):# 專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)簡(jiǎn)單的路由程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告姓名:#學(xué)號(hào):#專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)完成日期:2014/6/4目錄 TOC o 1-3 h z u HYPERLINK l _Toc389738459 實(shí)驗(yàn)環(huán)境 PAGEREF _Toc389738459 h 3 HYPERLINK l _Toc389738460 簡(jiǎn)單的路由程序設(shè)計(jì) PAGEREF _Toc389738460 h 3 HYPERLINK l _Toc389738461 路由軟件應(yīng)該處理的主要內(nèi)容 PAGEREF _Toc389738461 h 3 HYPERLINK l _Toc389738462 程序運(yùn)行
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ù)報(bào)的捕獲
3、與轉(zhuǎn)發(fā) PAGEREF _Toc389738467 h 12 HYPERLINK l _Toc389738468 實(shí)驗(yàn)結(jié)果 PAGEREF _Toc389738468 h 17 HYPERLINK l _Toc389738469 實(shí)驗(yàn)總結(jié)與心得體會(huì) PAGEREF _Toc389738469 h 18 HYPERLINK l _Toc389738470 實(shí)驗(yàn)中遇到的困難 PAGEREF _Toc389738470 h 18 HYPERLINK l _Toc389738471 實(shí)驗(yàn)心得 PAGEREF _Toc389738471 h 19實(shí)驗(yàn)環(huán)境本實(shí)驗(yàn)要求用VC編寫(xiě)簡(jiǎn)單路由程序,實(shí)現(xiàn)IP數(shù)據(jù)包的
4、轉(zhuǎn)發(fā)。在局域網(wǎng)中進(jìn)行調(diào)試,實(shí)驗(yàn)使用的以太網(wǎng)可以是共享式以太網(wǎng)也可以是交換式以太網(wǎng)。實(shí)驗(yàn)環(huán)境如下圖所示。路由R1、R2運(yùn)行自主編寫(xiě)的路由程序,綁定雙IP,通過(guò)路由程序添加路由表,對(duì)接收的數(shù)據(jù)包進(jìn)行分析和轉(zhuǎn)發(fā),實(shí)現(xiàn)處于不同網(wǎng)絡(luò)中的主機(jī)I和II的相互通信。通信測(cè)試由ping命令執(zhí)行,可以通過(guò)tracer +IP地址 來(lái)追蹤數(shù)據(jù)包在網(wǎng)絡(luò)中的轉(zhuǎn)發(fā)路徑。簡(jiǎn)單的路由程序設(shè)計(jì)路由軟件應(yīng)該處理的主要內(nèi)容編制一個(gè)較為完整的路由軟件相當(dāng)復(fù)雜包含如下工作:為經(jīng)過(guò)的IP 數(shù)據(jù)報(bào)選擇路由:路由器基本功能,對(duì)接受的IP數(shù)據(jù)報(bào)提取目的IP地址,根據(jù)自己的路由表信息為該數(shù)據(jù)報(bào)選擇最優(yōu)的轉(zhuǎn)發(fā)路徑。處理IP 數(shù)據(jù)報(bào)的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;-編輯路由表選項(xiàng):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;-刪除路由表選項(xiàng):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;/路由表中不存在所選項(xiàng)-匹配路由表選項(xiàng):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;/沒(méi)有匹配項(xiàng)elsereturn N_Hop;初始化操作獲得計(jì)算機(jī)上的設(shè)備列表,選擇一個(gè)設(shè)備
10、進(jìn)行偵聽(tīng),利用虛假地址請(qǐng)求本地MAC地址。此為第二次實(shí)驗(yàn)內(nèi)容,代碼相同,不再列出。添加默認(rèn)路由,網(wǎng)絡(luò)和子網(wǎng)掩碼為本機(jī)所處的環(huán)境,下一跳步為“直接投遞”。/添加投遞本地的路由選項(xiàng)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ù)報(bào)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);路由表操作:提示用戶是否要對(duì)路由表進(jìn)行操作,可以進(jìn)行的操作為増、刪、改。每次修改后會(huì)顯示路由表。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ù)報(bào)的捕獲與轉(zhuǎn)發(fā)根據(jù)流程圖,首先篩選出目的IP不是本機(jī)IP,目的MAC是本機(jī)MAC的IP數(shù)據(jù)報(bào),將其源MAC改為本機(jī)MAC,目的MAC 改為下一跳步MAC,TTL值減一,重新計(jì)算校驗(yàn)和,然后整理數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)出去。此操作為一個(gè)無(wú)限循環(huán),一旦進(jìn)入則不斷捕獲數(shù)據(jù)報(bào)并對(duì)符合條件的數(shù)據(jù)報(bào)進(jìn)行操作。do/編譯過(guò)濾規(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ò)濾規(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ù)報(bào)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;/請(qǐng)求的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;/確認(rèn)是否找到需要的ARP數(shù)據(jù)報(bào)while(true)/編譯過(guò)濾規(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ò)濾規(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)答報(bào)文if(ntohl(RecvARPFrame-SendIP)
28、=(ReqIP)/為請(qǐng)求的地址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-;/生存時(shí)間減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;/*校驗(yàn)和函數(shù)*/WORD ReChecksum;unsigned long cksum=0;for(i=0;i16)+(cksum&0 xffff);cksum+=(cksum16);ReChecksum=cksum;IPPacket-IPHeader.Checksum=ReChecksum;/重新置校驗(yàn)和/記錄轉(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 籃球單挑協(xié)議書(shū)
- 聯(lián)建工廠協(xié)議書(shū)
- 洗車臺(tái)租賃合同協(xié)議書(shū)
- 續(xù)租場(chǎng)地協(xié)議書(shū)
- 良田翻耕協(xié)議書(shū)
- 道路通信協(xié)議書(shū)
- 聯(lián)盟合作協(xié)議書(shū)
- 建房搭竹架安全協(xié)議書(shū)
- 店鋪?zhàn)赓U合同書(shū)協(xié)議書(shū)
- 肉羊供應(yīng)協(xié)議書(shū)
- 心理委員工作手冊(cè)
- GB/T 24346-2009紡織品防霉性能的評(píng)價(jià)
- 蛋糕店生日蛋糕操作流程
- 電能表測(cè)試要求和方法-課件
- 心臟彩超解讀完整版課件
- 醫(yī)療耗材配送服務(wù)方案
- 社會(huì)心理學(xué)第六講愛(ài)情課件
- 創(chuàng)業(yè)者與創(chuàng)業(yè)團(tuán)隊(duì)課件
- 滾筒冷渣機(jī)技術(shù)協(xié)議
- JB-ZQ 4763-2006 膨脹螺栓規(guī)格及性能
- Q∕GDW 10799.6-2018 國(guó)家電網(wǎng)有限公司電力安全工作規(guī)程 第6部分:光伏電站部分
評(píng)論
0/150
提交評(píng)論