• 大小: 7.11MB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2023-09-22
  • 语言: 其他
  • 标签: 模拟RIP  

资源简介

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]

评论

共有 条评论

相关资源