您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 商业计划书 > RIP协议C语言实现
RIP协议的C++实现班级:xxxxxxx学号:xxxxxxxxxx姓名:xxxxxxxx.x.xx一、RIP协议距离向量算法原理RIP的距离向量算法如下,当收到相邻路由器(其地址为X)的一个RIP报文时(1)先修改此RIP报文中的所有项目:将下一跳字段中的地址都改为X,并将所有的距离字段值加1;(2)对修改后的RIP报文中的每一个项目重复如下步骤:若项目中的目的网络不在路由表中,则将该项目加到路由表中。否则,若下一跳字段给出的路由器地址相同,则将收到的项目替换原路由表中的项目。否则,若收到的项目中的距离小于路由表中的距离,则进行更新。否则,什么都不做;(3)若3分钟还没有收到相邻路由器的更新路由表,则将此相邻路由器记为不可达的路由器,即将距离置为16(距离为16表示不可达);(4)返回。RIP让互联网中所有的路由器都和各自的相邻路由器不断交换并更新路由信息,最终可以使得每个路由器到到每个目的网络的距离最短。总之,RIP的优点是算法简单,但是RIP不适应大网络,也不适应变化剧烈的网络环境。从RIP算法的分析中可以发现其特点是“好消息传得快,坏消息传的慢”,这意味着当网络出现故障时,信息要经过较长时间才能通知到网内所有的路由器。二、RIP协议基于C++的实现2.1程序流程图读取txt中的网络信息路由器依次向相邻路由器发送RIP报文以更新网络中的设备路由表信息打印更新后的路由表信息更新路由表中的信息2.2需要生成的网络示意图即输入程序用的txt文件内容如下id1R1R5id2R1R4id3R1R2id4R2R3id5R5R6id6R3R6网2网1网3网4网5网6ABCEFD2.3程序运行结果输入写好的网络信息txt文件route更新前的路由表信息更新路由表中更新后的路由表信息2.4程序代码#includeiostream#includefstream#includestring#includelist#includesstreamusingnamespacestd;#defineMAX100classNet_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;}}//判断两路由是否相邻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;}
本文标题:RIP协议C语言实现
链接地址:https://www.777doc.com/doc-7352226 .html