用C++模拟RIP协议的工作原理

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

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

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

资源描述

山东大学威海分校信息工程学院软件工程系基于距离向量算法的路由协议的实现实验报告编号:姓名杜焓院系信息工程学院学号20078001075任课教师程杰指导教师程杰实验地点电子楼201实验时间11.10实验名称用C++模拟RIP协议的实现过程同组人预习报告(对实验主要内容的认识)得分RIP协议主要是通过对一个网络中的多个路由每个一定时间使用距离向量算法,从而实现每个路由中的路由表中的信息存储为该路由到每个网段的最短距离及其下一跳。实验内容(问题,思路,程序,结果)得分我的思路是先使用一个txt文档保存一个网络的基本信息,每行三个基本信息。分别为网段名,与连接次网段的两个路由器名。举例如下:存于txt文档中的相关信息如下:id1R1R2id2R3R4id3R4R6id4R2R7id5R2R3id6R6R8id7R3R8id8R7R8id9R1R3可以把它保存为net_route.txt。把这个文件放和.cpp文件放在同一文件夹下,即可运行程序。程序中会出现相应的路由表信息。程序代码如下:#includeiostream#includefstream#includestring#includelist#includesstream#includewindows.husingnamespacestd;#defineMAX100//最大路由数/*********************下面是存储类型的三个类*********************/classNet_sec;//路由类相当于头结点classRoute{public:classNet_sec;//路由类相当于头结点classRoute{public:stringroute;Net_sec*next;};//网段类,包含相邻弧的信息(不用route_f,用next),也可用于存储文件读入信息(用route_f,不用next)classNet_sec{public:stringnet_id;stringroute_f;stringroute_n;Net_sec*next;};//路由表内容类classContents{public:stringnet_id;intdiatance;stringnext_stop;};/*********************上面是存储类型的三个类*********************///路由表和网段类classRoute_net{public:voidopen_file(ifstream&infile);Route_net();booljudge(stringstr);voidInit_routes();voidshow();voidchange(inti);voidupdate(inti);voidUPDATE();boolneighbor(inti,intj);//j和i相邻吗private:listNet_secli;//读取信息存储在这Routeroute[MAX];//存储图的信息,即各路由的邻接表listContentsroutes[MAX];//存储各路由路由表listContentstemp;//用于存储处理后的临时路由表stringflection[MAX];//用于对应路由器与存储序列标号intsum;//用于统计路由个数};//打开文件函数voidRoute_net::open_file(ifstream&infile){stringfilename;coutenterthenameofthefilewhichcontainsinformationofroutesandnetworksection:;cinfilename;infile.open((filename+.txt).c_str());if(!infile){cerrfileopenerror!endl;exit(1);}}//构造函数Route_net::Route_net(){ifstreaminfile;istringstreamstrm;stringa_line;Net_sect1;open_file(infile);while(getline(infile,a_line)){strm.str(a_line);strmt1.net_idt1.route_ft1.route_n;li.push_back(t1);strm.clear();}//以上把文件内容存入了类属性li中listNet_sec::iteratorit1=li.begin(),it2;inti=0;Net_sec*t2,*t3;for(;it1!=li.end();it1++){if(judge((*it1).route_f)){flection[i]=(*it1).route_f;route[i].route=flection[i];t3=t2=route[i].next=newNet_sec();for(it2=li.begin();it2!=li.end();it2++){if(flection[i]==(*it2).route_f){t2-net_id=(*it2).net_id;t2-route_n=(*it2).route_n;t3=t2;t2-next=newNet_sec();t2=t2-next;}if(flection[i]==(*it2).route_n){t2-net_id=(*it2).net_id;t2-route_n=(*it2).route_f;t3=t2;t2-next=newNet_sec();t2=t2-next;}}t3-next=NULL;i++;}if(judge((*it1).route_n)){flection[i]=(*it1).route_n;route[i].route=flection[i];t3=t2=route[i].next=newNet_sec();for(it2=li.begin();it2!=li.end();it2++){if(flection[i]==(*it2).route_f){t2-net_id=(*it2).net_id;t2-route_n=(*it2).route_n;t3=t2;t2-next=newNet_sec();t2=t2-next;}if(flection[i]==(*it2).route_n){t2-net_id=(*it2).net_id;t2-route_n=(*it2).route_f;t3=t2;t2-next=newNet_sec();t2=t2-next;}}t3-next=NULL;i++;}}sum=i;route[i].next=NULL;//网络拓扑图的邻接表表示法}//判断一个路由是否已为其添加了路由表boolRoute_net::judge(stringstr){inti=0;while(flection[i]!=&&iMAX){i++;if(str==flection[i])returnfalse;}returntrue;}//初始化各路由表voidRoute_net::Init_routes(){inti=0;Net_sec*t;Contentsp;for(;route[i].next!=NULL;i++)for(t=route[i].next;t!=NULL;t=t-next){p.diatance=1;p.net_id=t-net_id;p.next_stop=直接交付;routes[i].push_back(p);}}//显示各路由表voidRoute_net::show(){inti=0;listContents::iteratorp;for(;isum;i++){coutThisisthetableofflection[i]endl;for(p=routes[i].begin();p!=routes[i].end();p++)cout(*p).net_id(*p).diatance(*p).next_stopendl;}}//对相邻路由表change一下,距离加1,下一跳变为该路由名字voidRoute_net::change(inti){Contentsco;temp.erase(temp.begin(),temp.end());listContents::iteratorp=routes[i].begin();for(;p!=routes[i].end();p++){co.diatance=(*p).diatance+1;co.net_id=(*p).net_id;co.next_stop=flection[i];temp.push_back(co);}}//对一个路由进行更新操作voidRoute_net::update(inti){intcount=0;listContents::iteratorit1=routes[i].begin();listContents::iteratorit2=temp.begin();for(;it2!=temp.end();it2++){for(it1=routes[i].begin();it1!=routes[i].end();it1++){if((*it1).net_id==(*it2).net_id){count++;if(((*it1).next_stop)==((*it2).next_stop)){(*it1).diatance=(*it2).diatance;(*it1).next_stop=(*it2).next_stop;}if(((*it1).next_stop!=(*it2).next_stop)&&((*it1).diatance(*it2).diatance)){(*it1).diatance=(*it2).diatance;(*it1).next_stop=(*it2).next_stop;}}}if(count==0)routes[i].push_back(*it2);count=0;}}//对所有路由进行更新路由表操作voidRoute_net::UPDATE(){intj=0,i=0,I;for(I=0;Isum;I++){for(j=0;jsum;j++){for(i=0;isum;i++){if(neighbor(j,i)){change(i);update(j);}}}coutThisistheI+1running.......endl;Sleep(2000);}}//判断两路由是否相邻boolRoute_net::neighbor(inti,intj){Net_sec*p=route[i].next;for(;p!=NULL;p=p-next)if(flection[j]==p-route_n)returntrue;returnfalse;}intmain(){Route_netroute_net;route_net.Init_routes();route_net.show();route_net.UPDATE();route_net.show();return0;}运行程序如图:输入txt文件的名字为net_route(不用.txt)。然后回车实验结论得分程序首先输出,初始化的路由表信息,然后经过若干次处理输出最终的路由表信息。由于模拟的网络不会发生变化,因此这边是最终的个路由的路由表信息。教师评价总分实际得分

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

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

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

×
保存成功