用(目的网络掩码)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计算机网络实习报告设计题目编程查路由表学生专业班级学生姓名(学号)指导教师完成时间2010年5月26日实习(设计)地点信息楼139机房2010年5月26日计算机网络与通信实习一、编写计算机程序用(目的网络掩码下一跳)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出。二、原理概述当IP子网中的一台主机发送IP分组给同一IP子网的另一台主机时,它将直接把IP分组送到网络上,对方就能收到。而要送给不同IP于网上的主机时,它要选择一个能到达目的子网上的路由器,把IP分组送给该路由器,由路由器负责把IP分组送到目的地。如果没有找到这样的路由器,主机就把IP分组送给一个称为“缺省网关(defaultgateway)”的路由器上。“缺省网关”是每台主机上的一个配置参数,它是接在同一个网络上的某个路由器端口的IP地址。路由器转发IP分组时,只根据IP分组目的IP地址的网络号部分,选择合适的端口,把IP分组送出去。同主机一样,路由器也要判定端口所接的是否是目的子网,如果是,就直接把分组通过端口送到网络上,否则,也要选择下一个路由器来传送分组。路由器也有它的缺省网关,用来传送不知道往哪儿送的IP分组。这样,通过路由器把知道如何传送的IP分组正确转发出去,不知道的IP分组送给“缺省网关”路由器,这样一级级地传送,IP分组最终将送到目的地,送不到目的地的IP分组则被网络丢弃了。三、设计方案1、从收到的数据报的首部提取目的IP地址D2、先判断是否为直接交付3、若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由表4、对路由表中的每一行,用其中的子网掩码和D逐位相“与”,其结果为N5、若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行66、报告转发分组出错四、程序编写#includestring#includebitset#includeiterator#includeiostream#includelist#includecstdlib#includefstreamusingnamespacestd;classAddr//地址类,4个分量{public:Addr(stringstr);//构造函数Addr(constAddr&address);//拷贝构造函数//ostream&operator(ostream&out,constAddr&object);//向默认输出设备输出,暂不提供//Addr&operator=(constAddr&object);//发现会造成内存泄漏,所以先取消掉他booloperator==(constAddr&object);//为了效率,相等操作符只比较整型IP地址,不比较bitset型Addr&operator&=(constAddr&object);voidoutput();//输出IP地址~Addr();private:intstr_to_int(stringstr);//这个函数进行字符串到整形数的转换,由于它只是私有函数,所以函数实现中只进行了基本的错误检测,对很多输入错误没有进行检测inlinevoidset(stringstr);//把IP地址存到对象中,因为效率,这个函数声明为inlinebitset8*bin_addr1,*bin_addr2,*bin_addr3,*bin_addr4;//这里把bitset声明成指针类型是因为标准库中只提供构造时从无符号长整型向二进制转换而初始化静态成员只能在类初始化列表中,这时还没获得用于初始化的字符串,所以只能采用动态的内存管理,给理解上造成少许不便intint_addr1,int_addr2,int_addr3,int_addr4;//整数分别存IP地址};Addr::Addr(std::stringstr){set(str);}Addr::Addr(constAddr&address){int_addr1=address.int_addr1;int_addr2=address.int_addr2;int_addr3=address.int_addr3;int_addr4=address.int_addr4;bin_addr1=newbitset8(*(address.bin_addr1));bin_addr2=newbitset8(*(address.bin_addr2));bin_addr3=newbitset8(*(address.bin_addr3));bin_addr4=newbitset8(*(address.bin_addr4));}Addr::~Addr(){deletebin_addr1;deletebin_addr2;deletebin_addr3;deletebin_addr4;}structRouteTable{Addr*dest;//目的地Addr*mask;//掩码intnextdump;//下一跳};inlinevoidAddr::set(stringstr)//把IP地址存到对象中,因为效率,这个函数声明为inline{stringstrtemp;intcount=1;intsize=int(str.size());for(string::iteratorpos=str.begin();pos!=str.end();++pos){if(*pos=='.'||*pos=='|'){switch(count){case1:int_addr1=str_to_int(strtemp);bin_addr1=newbitset8(unsignedlong(int_addr1));break;case2:int_addr2=str_to_int(strtemp);bin_addr2=newbitset8(unsignedlong(int_addr2));break;case3:int_addr3=str_to_int(strtemp);bin_addr3=newbitset8(unsignedlong(int_addr3));break;case4:int_addr4=str_to_int(strtemp);bin_addr4=newbitset8(unsignedlong(int_addr4));break;}++count;strtemp.erase();}else{strtemp+=*pos;}}return;}intAddr::str_to_int(stringstr)//这个函数进行字符串到整形数的转换{string::iteratorpos=str.begin();charchtemp;inttemp,result=0;intsize=int(str.size());if(size==1&&*pos=='0')return0;for(inti=size;i=1;--i){chtemp=*pos;switch(chtemp){case'0':temp=0;break;case'1':temp=1;break;case'2':temp=2;break;case'3':temp=3;break;case'4':temp=4;break;case'5':temp=5;break;case'6':temp=6;break;case'7':temp=7;break;case'8':temp=8;break;case'9':temp=9;break;default:return-1;//不是数字字符,出错}if(i==3)result=temp*100+result;elseif(i==2)result=temp*10+result;elseif(i==1)result=temp+result;elsereturn-1;//防止错误发生++pos;//迭代器后移}returnresult;}voidAddr::output(){coutint_addr1.int_addr2.int_addr3.int_addr4endl;return;}/*Addr&Addr::operator=(constAddr&object){int_addr1=object.int_addr1;int_addr2=object.int_addr2;int_addr3=object.int_addr3;int_addr4=object.int_addr4;bin_addr1=newbitset8(*(object.bin_addr1));bin_addr2=newbitset8(*(object.bin_addr2));bin_addr3=newbitset8(*(object.bin_addr3));bin_addr4=newbitset8(*(object.bin_addr4));return*this;}*///这里当Addr对象中指针已经有数值的时候,在对他进行赋值操作///会发生内存泄漏,原来的内存单元无法被释放,所以取消这个函数boolAddr::operator==(constAddr&object){return(object.int_addr1==int_addr1&&object.int_addr2==int_addr2&&object.int_addr3==int_addr3&&object.int_addr4==int_addr4);}Addr&Addr::operator&=(constAddr&object){*bin_addr1&=*object.bin_addr1;*bin_addr2&=*object.bin_addr2;*bin_addr3&=*object.bin_addr3;*bin_addr4&=*object.bin_addr4;int_addr1=int(bin_addr1-to_ulong());int_addr2=int(bin_addr2-to_ulong());int_addr3=int(bin_addr3-to_ulong());int_addr4=int(bin_addr4-to_ulong());return*this;}intloadrt(stringfilename,listRouteTable&rt){ifstreaminfile;infile.open(filename.c_str());if(!infile){cerr打开文件失败!endl;system(PAUSE);return-1;}stringdest,mask;intnextdump;RouteTable*temprt;while(!infile.eof()){infiledestmasknextdump;temprt=newRouteTable;(*temprt).dest=newAddr(dest);(*temprt).mask=newAddr(mask);(*temprt).nextdump=nextdump;rt.push_back(*temprt);}return0;}intmain(){stringfilename=e:\\RouteTable.txt;listRouteTablert;loadrt(filename,rt);//从文件载入路由表//destAddr-output();//输出路由表内容cout当前路由表内容:\nendl;listRouteTable::iteratorrtlist=rt.begin();intcount=1;while(rtlist!=rt.end()){cout第count条记录:\n;cout目的地址:;(*rtlist).dest-output();cout子网掩码:;(*rtlist).mas

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功