RIP协议的距离向量算法实现(c++)

模拟路由表示意图

RIP协议的距离向量算法实现(c++)_第1张图片

核心:

  • 新的直接进表
  • 下一跳不一样要短的
  • 下一跳一样要新的

(应用层的不是网络层的)

算法实现:

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

const int maxR=6;//最大路由器数量

//时间间隔辅助函数
typedef long long ll;
ll getNowTime(){//返回秒数
	struct timeval tv;
	struct timezone tz;
	gettimeofday(&tv,&tz);
	return tv.tv_sec;//零头的微秒忽略
}

//路由表项
struct RIP{
	char name;//本路由器名称
	int N;//到目的网络N
	int d;//距离d
	char X;//下一跳路由器
	ll time;//上次更新时间
	bool is_valid;//是否有效
	RIP(){is_valid=true;}
};

//发送的报文打包
vector Send(vector r,char c){
	for(int i=0;i 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(){
	vector r;
	for(int i=0;i>N;
	for(int i=0;i>name;//因为按顺序的所以不处理了
		rp.name=name;//处理下也行 不过一次处理一次就够了  冗余但安全性高了
		while(infile>>rp.N>>rp.d>>rp.X&&rp.N){
			rp.time=getNowTime();
			rip[i].push_back(rp);
		}
	}
	infile.close();
}

//用领接表初始化网络结构图
void initve(char* file){
	fstream infile(file);
	if(!infile.is_open()) cout<<"未成功打开文件!"<>v){//第一个是当前结点 后面的都是当前结点的所有邻居 0表示结束
		while(infile>>v1&&v1!='0'){
			ve[v-'A'].push_back(v1);
		}
	}
	infile.close();
}

//打印图
void printG(){
	cout<<"**********************网络拓扑结构********************\n";
	for(int i=0;i send;
	vector rip1[maxR];
	for(int i=0;i180) rip[i][j].is_valid=false;//180s无更新 标记无效
			else if(!rip[i][j].is_valid&&(t1-rip[i][j].time)>120) rip[i].erase(rip[i].begin()+j);//无效后120s无更新 删除
		}
	}
}

int main(){
	// freopen("运行结果.txt","w",stdout);
	init("routes.txt");//用文件routes.txt初始化
	printR();
	initve("netGraphic.txt");//初始化网络拓扑图
	printG();
	int T=0,n=0;
	while(true){
		sleep(1);//每隔3秒更新路由表 为了演示运行结果方便不设置为30s秒了
		cout<<"\n------------------------第"<<++T<<"次更新------------------------\n";
		if(update()){//一次更新
			printR();//打印路由表
			n++;
		}else{
			cout<<"本次没有任何有价值的修改!说明前面"<

文件:

netGraphic.txt 网络拓扑图 0代表一行结束

A B D E 0
B A C 0
C B F 0
D A E F 0
E A D F 0
F C D E 0

routes.txt 各个路由表初始状态

6

A
1 1 -
2 1 -
3 1 -
0 0 0

B
3 1 -
4 1 -
0 0 0

C
4 1 -
6 1 -
0 0 0

D
2 1 -
5 1 -
0 0 0

E
1 1 -
5 1 -
0 0 0

F
5 1 -
6 1 -
0 0 0

#第一个数字N表示路由器个数
#N组,每组表示一个路由器表项 每个路由器表项中目的网络为0表示此路由器结束

3个文件要放在同一个文件夹下执行

RIP协议的距离向量算法实现(c++)_第2张图片

运行结果:

***********************路由表A************************
到目的网络N		距离d		下一跳路由器X
1				1			-
2				1			-
3				1			-
***********************路由表B************************
到目的网络N		距离d		下一跳路由器X
3				1			-
4				1			-
***********************路由表C************************
到目的网络N		距离d		下一跳路由器X
4				1			-
6				1			-
***********************路由表D************************
到目的网络N		距离d		下一跳路由器X
2				1			-
5				1			-
***********************路由表E************************
到目的网络N		距离d		下一跳路由器X
1				1			-
5				1			-
***********************路由表F************************
到目的网络N		距离d		下一跳路由器X
5				1			-
6				1			-
**********************网络拓扑结构********************
A B D E
B A C
C B F
D A E F
E A D F
F C D E

------------------------第1次更新------------------------
***********************路由表A************************
到目的网络N		距离d		下一跳路由器X
1				1			-
2				1			-
3				1			-
4				2			B
5				2			D
***********************路由表B************************
到目的网络N		距离d		下一跳路由器X
1				2			A
2				2			A
3				1			-
4				1			-
6				2			C
***********************路由表C************************
到目的网络N		距离d		下一跳路由器X
3				2			B
4				1			-
5				2			F
6				1			-
***********************路由表D************************
到目的网络N		距离d		下一跳路由器X
1				2			A
2				1			-
3				2			A
5				1			-
6				2			F
***********************路由表E************************
到目的网络N		距离d		下一跳路由器X
1				1			-
2				2			A
3				2			A
5				1			-
6				2			F
***********************路由表F************************
到目的网络N		距离d		下一跳路由器X
1				2			E
2				2			D
4				2			C
5				1			-
6				1			-

------------------------第2次更新------------------------
***********************路由表A************************
到目的网络N		距离d		下一跳路由器X
1				1			-
2				1			-
3				1			-
4				2			B
5				2			D
6				3			B
***********************路由表B************************
到目的网络N		距离d		下一跳路由器X
1				2			A
2				2			A
3				1			-
4				1			-
5				3			A
6				2			C
***********************路由表C************************
到目的网络N		距离d		下一跳路由器X
1				3			B
2				3			B
3				2			B
4				1			-
5				2			F
6				1			-
***********************路由表D************************
到目的网络N		距离d		下一跳路由器X
1				2			A
2				1			-
3				2			A
4				3			A
5				1			-
6				2			F
***********************路由表E************************
到目的网络N		距离d		下一跳路由器X
1				1			-
2				2			A
3				2			A
4				3			A
5				1			-
6				2			F
***********************路由表F************************
到目的网络N		距离d		下一跳路由器X
1				2			E
2				2			D
3				3			C
4				2			C
5				1			-
6				1			-

------------------------第3次更新------------------------
本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第4次更新------------------------
本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第5次更新------------------------
本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第6次更新------------------------
本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第7次更新------------------------
本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第8次更新------------------------
本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第9次更新------------------------
本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

------------------------第10次更新------------------------
本次没有任何有价值的修改!说明前面2次修改后,每一个路由器都得到了全局路由信息!

 

你可能感兴趣的:(计算机网络)