简单路由程序实验报告(共21页)_第1页
简单路由程序实验报告(共21页)_第2页
简单路由程序实验报告(共21页)_第3页
简单路由程序实验报告(共21页)_第4页
简单路由程序实验报告(共21页)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、姓名:# 学号:# 专业:计算机科学与技术简单(jindn)的路由程序设计实验报告姓名(xngmng):#学号:#专业(zhuny):计算机科学与技术完成日期:2014/6/4目录 TOC o 1-3 h z u HYPERLINK l _Toc389738459 实验环境 PAGEREF _Toc389738459 h 3 HYPERLINK l _Toc389738460 简单的路由程序设计 PAGEREF _Toc389738460 h 3 HYPERLINK l _Toc389738461 路由软件应该处理的主要内容 PAGEREF _Toc389738461 h 3 HYPERLIN

2、K l _Toc389738462 程序运行流程图解 PAGEREF _Toc389738462 h 4 HYPERLINK l _Toc389738463 程序代码详解 PAGEREF _Toc389738463 h 6 HYPERLINK l _Toc389738464 路由表处理函数: PAGEREF _Toc389738464 h 6 HYPERLINK l _Toc389738465 初始化操作 PAGEREF _Toc389738465 h 8 HYPERLINK l _Toc389738466 路由表操作: PAGEREF _Toc389738466 h 9 HYPERLINK

3、l _Toc389738467 数据报的捕获与转发 PAGEREF _Toc389738467 h 12 HYPERLINK l _Toc389738468 实验结果 PAGEREF _Toc389738468 h 17 HYPERLINK l _Toc389738469 实验总结与心得体会 PAGEREF _Toc389738469 h 18 HYPERLINK l _Toc389738470 实验中遇到的困难 PAGEREF _Toc389738470 h 18 HYPERLINK l _Toc389738471 实验心得 PAGEREF _Toc389738471 h 19实验(shyn

4、)环境(hunjng)本实验(shyn)要求用VC编写简单路由程序,实现IP数据包的转发。在局域网中进行调试,实验使用的以太网可以是共享式以太网也可以是交换式以太网。实验环境如下图所示。路由R1、R2运行自主编写的路由程序,绑定双IP,通过路由程序添加路由表,对接收的数据包进行分析和转发,实现处于不同网络中的主机I和II的相互通信。通信测试由ping命令执行,可以通过tracer +IP地址 来追踪数据包在网络中的转发路径。简单的路由程序设计路由软件应该处理的主要内容编制一个较为完整的路由软件相当复杂包含如下工作:为经过的IP 数据报选择路由:路由器基本功能,对接受的IP数据报提取目的IP地址

5、,根据自己的路由表信息为该数据报选择最优的转发路径。处理IP 数据报的TTL域中的数值,抛弃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=a

6、ddroute-desnet)&(temp-netmask=addroute-netmask)return false;/重复添加temp-next=new router_chart;memcpy(temp-next,addroute,sizeof(struct router_chart);router_size+;temp-next-next=NULL;return true;-编辑(binj)路由表选项:BOOL edit_route(router_chart *rc,int choice,router_chart *editroute)if(router_size=0|choicerou

7、ter_size)return false;router_chart *temp;temp=rc;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-

8、netmask;temp-NextHop=editroute-NextHop;*/return true;return false;-删除(shnch)路由表选项: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;rout

9、er_size-;return true;return false;/路由表中不存在(cnzi)所选项-匹配(ppi)路由表选项:ULONG 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

10、)return 0 xffffffff;/没有(mi yu)匹配项elsereturn N_Hop;初始化操作获得计算机上的设备列表,选择一个设备进行侦听,利用虚假地址请求本地MAC地址。此为第二次实验内容,代码相同,不再列出。添加默认路由,网络和子网掩码为本机所处的环境,下一跳步为“直接投递”。/添加投递本地的路由选项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_desne

11、t=(IfInfo.IPAddrtest2)&IfInfo.IPMask;/网络地址=IP地址(dzh)&子网掩码test2+;r_nexthop=0;/本路由所在(suzi)网络,直接投递数据报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;foutr

12、c.close();flush_rctxt(rc);/将数据(shj)缓冲到router_chart.txt文档中foutrc.open(router_chart.txt,ios: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 t

13、empi=1;coutnext)couttempinetmask);t2=htonl(temprc-desnet);t3=htonl(temprc-NextHop);memcpy(&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,

14、others for no)n;cout(a for add,e for edit,d for delete, others for quit)n;couteditrc;if(editrc=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(

15、DN=INADDR_NONE);docoutcnh;NH=(htonl)(inet_addr(cnh);while(NH=INADDR_NONE);router_chart *temprc2;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-N

16、extHop);foutrcrouter_size:;memcpy(&addr_temp,&t1,4);foutrcinet_ntoa(addr_temp)t;memcpy(&addr_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

17、 the addition!n;elseif(edit_route(rc,edit,temprc)foutrc.close();flush_rctxt(rc);foutrc.open(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.t

18、xt,ios:out|ios:app);else coutError occurs in the deletion!n;coutgoon;while(goon=Y|goon=y);数据(shj)报的捕获与转发根据(gnj)流程图,首先筛选出目的IP不是(b shi)本机IP,目的MAC是本机MAC的IP数据报,将其源MAC改为本机MAC,目的MAC 改为下一跳步MAC,TTL值减一,重新计算校验和,然后整理数据报转发出去。此操作为一个无限循环,一旦进入则不断捕获数据报并对符合条件的数据报进行操作。do/编译过滤规则filter=ip;if(pcap_compile(IfInfo.adhandl

19、e,&fcode,filter,1,IfInfo.IPMask)0)coutFail to compile the filtering expression,please check your filtering expression syntax!n;cout*ERROR in opening interface!*endl;/设置过滤规则if(pcap_setfilter(IfInfo.adhandle,&fcode)0)coutFail to set the filter!n;cout*ERROR in opening interface!*endl;/*/pcap_rtn=pcap_n

20、ext_ex(IfInfo.adhandle,&pkt_header,&pkt_data);IPPacket = (Data_t *)pkt_data; if(pcap_rtn=1) cout*Successfully capturing data packet!*FrameHeader.FrameType)=0 x0800)&(memcmp(IPPacket-FrameHeader.DesMAC),IfInfo.MACAddr,6)=0)/00)/为IP 数据(shj)报u_char *SendIPPacket;int plen=pkt_header-len+sizeof(FrameHead

21、er_t);SendIPPacket=new u_charplen;memcpy(SendIPPacket,pkt_data,plen);/ULONG len;ULONG next_hop;/请求(qngqi)的IP 和由ARP 获得(hud)该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

22、*desmac =(IPPacket-FrameHeader.DesMAC);BYTE *srcmac =(IPPacket-FrameHeader.SrcMAC);u_short frametype =(ntohs(IPPacket-FrameHeader.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

23、.IPAddr1)/目的(md)MAC地址为本地(bnd),但是目的IP不是(b shi)本地coutntest!n;/SendIPPacket=(Data_t *)pkt_data;cout*Successfully recieved an IPPacket :;foutlogIPHeader.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 ;foutlogD

24、esIP &src_ip&des_ipDesMAC ;mac_out(srcmac);cout;foutlog;mac_out(desmac);if(ttl=0)coutnThe IPPacket has reached its due time(TTL=1), throwing!;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;

25、couthexnext_hopdecendl;if(next_hop=0 xffffffff)/匹配(ppi)失败coutn*Failed to match any router chart item!;foutlogIPHeader.DstIP);coutn*Successully find the match router chart item, the NextHop is: inet_ntoa(addr_temp) (Direct deliver!);foutlogn*Successully find the match router chart item, the NextHop i

26、s: inet_ntoa(addr_temp) (Direct deliver!);elseReqIP=next_hop;coutn*Successully find the match router chart item, the NextHop is: inet_ntoa(addr_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_ad

27、dr=1;int trycont=1;bool flag=false;/确认是否找到需要的ARP数据报while(true)/编译(biny)过滤规则filter=arp;if(pcap_compile(IfInfo.adhandle,&fcode,filter,1,IfInfo.IPMask)0)coutFail to compile the filtering expression,please check your filtering expression syntax!n;cout*ERROR in opening interface!*endl;/设置(shzh)过滤规则if(pca

28、p_setfilter(IfInfo.adhandle,&fcode)0)coutFail to set the filter!n;cout*ERROR in opening interface!*Operation)=0 x0002)/为ARP应答报文if(ntohl(RecvARPFrame-SendIP)=(ReqIP)/为请求的地址memcpy(ReqMAC,RecvARPFrame-SendHa,6);/获得Mac地址flag=true;break;if(flag)break;addr_temp.S_un.S_addr=ntohl(ReqIP);coutn*ARP Request s

29、uccessed! ;foutlogn*ARP Request successed! ;coutnIP address:inet_ntoa(addr_temp);foutlognIP address:inet_ntoa(addr_temp);cout MAC address:;foutlogMAC address:;mac_out(ReqMAC);coutn*endl;coutnDelivering the IPPackete:;foutlogFrameHeader.DesMAC,ReqMAC,6);memcpy(IPPacket-FrameHeader.SrcMAC,IfInfo.MACAd

30、dr,6);IPPacket-IPHeader.TTL-;/生存(shngcn)时间减1WORD ip0=MAKEWORD(IPPacket-IPHeader.Ver_HLen,IPPacket-IPHeader.TOS);WORD ip1=IPPacket-IPHeader.TotalLen;WORD ip2=IPPacket-IPHeader.ID;WORD ip3=IPPacket-IPHeader.Flag_Segment;WORD ip4=MAKEWORD(IPPacket-IPHeader.TTL,IPPacket-IPHeader.Protocol);WORD ip5=0;WOR

31、D ip6=HIWORD(IPPacket-IPHeader.SrcIP);WORD ip7=LOWORD(IPPacket-IPHeader.SrcIP);WORD ip8=HIWORD(IPPacket-IPHeader.DstIP);WORD ip9=LOWORD(IPPacket-IPHeader.DstIP);WORD IP10=ip0,ip1,ip2,ip3,ip4,ip5,ip6,ip7,ip8,ip9;/*校验(xio yn)和函数*/WORD ReChecksum;unsigned long cksum=0;for(i=0;i16)+(cksum&0 xffff);cksum

32、+=(cksum16);ReChecksum=cksum;IPPacket-IPHeader.Checksum=ReChecksum;/重新(chngxn)置校验和/记录转发(zhun f)内容/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_ntoa(src_ipaddr);des_ip=inet_ntoa(des_ipaddr);coutDesIP &src_ip&des_ipDesMAC ;foutlogDesIP &src_ip&des_ipD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论