资源简介
RIP协议是一种动态路由协议。RIP协议基于距离矢量算法。使用“跳数”来衡量到达目标地址的路由距离,实现RIP协议
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxR=6;//路由器数量
typedef __int64 ll;
//路由表项
struct RIP{
char name;//本路由器名称
int N;//到目的网络N
int d;//距离d
char X;//下一跳路由器
bool is_valid;//是否有效,即可达
RIP(){is_valid=true;}
ll time;//上次更新时间
};
//发送的报文
vector Send(vector rchar c){
for(int i=0;i r[i].d++;//到所有目的网络距离加1
r[i].X=c; //下一跳改为现在的路由器名称
time_t now_time;
now_time = time(NULL);
r[i].time = now_time; //发送的时间
}
return r;
}
vector rip[maxR];//路由表 相当于RIP rip[maxR]创建一个结构体动态数组对象
char idToRname[]=“ABCDEF“;//int编号改为字母标号 0-A 1-B 2-C 3-D 4-E 5-F
vector ve[maxR];//一个vector包含多条记录是一个路由表 ve则可表示路由器分布图邻接表
//打印路由表
void printR(char x){
int j = x-‘A‘;
vector r;
r=rip[j];
cout<<“<----------------------路由表“<“< cout<<“到目的网络N\t\t距离d\t\t下一跳路由器X“< for( int i=0;i cout< }
}
//用文件root的内容更新各个路由器
void init(char* file){
fstream infile(file);
if(!infile.is_open()) cout<<“未成功打开文件!“< int N;
char name;
RIP rp;
infile>>N;//路由器数量
for(int i=0;i infile>>name;//路由器名称
rp.name=name;
while(infile>>rp.N>>rp.d>>rp.X&&rp.N){
time_t now_time;
now_time = time(NULL);
rp.time = now_time;
rip[i].push_back(rp);//在数组的最后添加一个数据
}
}
infile.close();
}
//用邻接表初始化网络结构图
void initve(char* file){
fstream infile(file);
if(!infile.is_open()) cout<<“未成功打开文件!“< char vv1;
while(infile>>v){//第一个是当前结点 后面的都是当前结点的邻接点
while(infile>>v1&&v1!=‘0‘){
ve[v-‘A‘].push_back(v1);
}
}
infile.close();
}
//打印图
void printG(){
cout<<“<----------------------网络拓扑结构---------------------->“< for(int i=0;i cout< for(int j=0;j cout< if(j cout<<“ “;
}
cout< }
}
//路由表排序依据
bool cmp(RIP r1RIP r2){
return r1.N }
//正式发送更新报文更新路由表
bool update(){
bool hasEdit=false;//本次更新有无修改
vector send;//创建一个即将发送的报文
vector rip1[maxR];//创建新的路由表用来保存未更新的路由表
for(int i=0;i rip1[i]=rip[i];
//遍历每个路由结点
for( i=0;i send=Send(rip[i]i+‘A‘);//向邻居发送的路由更新报文
for(int j=0;j //遍历第i个路由器的所有邻居 目的就是更新邻居
//本次给邻居ve[i][j] 一个序号
int lid=ve[i][j]-‘A‘;
for(int x=0;x //遍历发过来的更新报文
int k;
//检查筛选时要筛选新的
for(k=0;k //遍历邻居路由表 查找更新报文的每一条
//rip1[lid]是第lid个路由表 rip1[lid][k]是第lid个路由表的第k条记录
if(send[x].d!=16 && rip1[lid][k].d!=16)
{
if(send[x].N==rip1[lid][k].N){//目的地址相同
if(send[x].X==rip1[lid][k].X){//下一跳相同
if(rip1[lid][k].d!=send[x].d){//N X 都相同 d不同 更新
rip1[lid][k]=send[x]
评论
共有 条评论