1、RIP协议C语言实现RIP协议的C+实现班级: xxxxxxx 学号: xxxxxxxxxx 姓名: xxxx xxxx.x.xx一、RIP协议距离向量算法原理RIP的距离向量算法如下,当收到相邻路由器(其地址为X)的一个RIP报文时(1)先修改此RIP报文中的所有项目:将下一跳字段中的地址都改为X,并将所有的距离字段值加1;(2)对修改后的RIP报文中的每一个项目重复如下步骤:若项目中的目的网络不在路由表中,则将该项目加到路由表中。否则,若下一跳字段给出的路由器地址相同,则将收到的项目替换原路由表中的项目。否则,若收到的项目中的距离小于路由表中的距离,则进行更新。否则,什么都不做;(3)若3
2、分钟还没有收到相邻路由器的更新路由表,则将此相邻路由器记为不可达的路由器,即将距离置为16(距离为16表示不可达);(4)返回。RIP让互联网中所有的路由器都和各自的相邻路由器不断交换并更新路由信息,最终可以使得每个路由器到到每个目的网络的距离最短。总之,RIP的优点是算法简单,但是RIP不适应大网络,也不适应变化剧烈的网络环境。从RIP算法的分析中可以发现其特点是“好消息传得快,坏消息传的慢”,这意味着当网络出现故障时,信息要经过较长时间才能通知到网内所有的路由器。二、RIP协议基于C+的实现2.1 程序流程图2.2 需要生成的网络示意图 即输入程序用的txt文件内容如下id1 R1 R5i
3、d2 R1 R4id3 R1 R2id4 R2 R3id5 R5 R6id6 R3 R62.3 程序运行结果输入写好的网络信息txt文件route更新前的路由表信息更新路由表中更新后的路由表信息2.4 程序代码#include#include#include#include#includeusing namespace std;#define MAX 100class Net_sec;/路由类相当于头结点class Routepublic: string route; Net_sec *next;/网段类,包含相邻弧的信息(不用route_f,用next),也可用于存储文件读入信息(用rout
4、e_f,不用next)class Net_sec public: string net_id; string route_f; string route_n; Net_sec* next;/路由表内容类class Contentspublic: string net_id; int diatance; string next_stop;/*上面是存储类型的三个类*/路由表和网段类class Route_netpublic: void open_file(ifstream& infile); Route_net(); bool judge(string str); void Init_route
5、s(); void show(); void change(int i); void update(int i); void UPDATE(); bool neighbor(int i,int j);/j和i相邻吗private: list li; /读取信息存储在这 Route routeMAX; /存储图的信息,即各路由的邻接表 list routesMAX; /存储各路由路由表 list temp; /用于存储处理后的临时路由表 string flectionMAX; /用于对应路由器与存储序列标号 int sum; /用于统计路由个数;/打开文件函数void Route_net:ope
6、n_file(ifstream& infile) string filename; coutfilename; infile.open(filename+.txt).c_str(); if(!infile) cerrfile open error!_idt1.route_ft1.route_n; li.push_back(t1); strm.clear(); /以上把文件内容存入了类属性li中 list:iterator it1=li.begin(),it2; int i=0; Net_sec *t2,*t3; for(;it1!=li.end();it1+) if(judge(*it1).r
7、oute_f) flectioni=(*it1).route_f; routei.route=flectioni; t3=t2=routei.next=new Net_sec(); for(it2=li.begin();it2!=li.end();it2+) if(flectioni=(*it2).route_f) t2-net_id=(*it2).net_id; t2-route_n=(*it2).route_n; t3=t2; t2-next=new Net_sec(); t2=t2-next; if(flectioni=(*it2).route_n) t2-net_id=(*it2).n
8、et_id; t2-route_n=(*it2).route_f; t3=t2; t2-next=new Net_sec(); t2=t2-next; t3-next=NULL; i+; if(judge(*it1).route_n) flectioni=(*it1).route_n; routei.route=flectioni; t3=t2=routei.next=new Net_sec(); for(it2=li.begin();it2!=li.end();it2+) if(flectioni=(*it2).route_f) t2-net_id=(*it2).net_id; t2-rou
9、te_n=(*it2).route_n; t3=t2; t2-next=new Net_sec(); t2=t2-next; if(flectioni=(*it2).route_n) t2-net_id=(*it2).net_id; t2-route_n=(*it2).route_f; t3=t2; t2-next=new Net_sec(); t2=t2-next; t3-next=NULL; i+; sum=i; routei.next=NULL;/网络拓扑图的邻接表表示法/判断一个路由是否已为其添加了路由表bool Route_net:judge(string str) int i=0;
10、 while(flectioni!=&inext) p.diatance=1; _id=t-net_id; p.next_stop=直接交付; routesi.push_back(p); /显示各路由表void Route_net:show() int i=0; list:iterator p; for(;isum;i+) cout This is the table of flectioniendl; for(p=routesi.begin();p!=routesi.end();p+) cout(*p).net_id (*p).diatance (*p).next_stopendl; /对相
11、邻路由表change一下,距离加1,下一跳变为该路由名字void Route_net:change(int i) Contents co; temp.erase(temp.begin(),temp.end(); list:iterator p=routesi.begin(); for(;p!=routesi.end();p+) co.diatance=(*p).diatance+1; _id=(*p).net_id; co.next_stop=flectioni; temp.push_back(co); /对一个路由进行更新操作void Route_net:update(int i) int
12、count=0;list:iterator it1=routesi.begin(); list:iterator it2=temp.begin(); for(;it2!=temp.end();it2+) for(it1=routesi.begin();it1!=routesi.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(*
13、it1).next_stop!=(*it2).next_stop)&(*it1).diatance(*it2).diatance) (*it1).diatance=(*it2).diatance; (*it1).next_stop=(*it2).next_stop; if(count=0) routesi.push_back(*it2); count=0; /对所有路由进行更新路由表操作void Route_net:UPDATE() int j=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); coutThis is the I+1 running.next) if(flectionj=p-route_n) return true; return false;int main() Route_net route_net; route_net.Init_routes(); route_net.show(); route_net.UPDATE(); route_net.show(); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1