计算机网络——RIP协议距离向量算法

#include
#include
#include
using namespace std;
bool Rout[12];

struct Net {
	int d, nextR;
	Net() {//构造函数:初始距离为17不存在,且没有下一跳
		d = 17; nextR = -1;
	}
};
struct Router {//路由表
	Net net[16];//到网络net[i]的距离为net[i].d,下一跳为路由net[i].nextR
	int time[16] = { 0 };//各网络更新时间(初始化为0)
}R[12];

void InitRouteTable() {//初始化路由表
	for (int i = 1; i <= 10; i++) {//设定路由表1-10
		R[i].net[i].d = R[i].net[i + 1].d = 1;//路由i到网i和网i+1距离为1
		R[i].net[i].nextR = R[i].net[i + 1].nextR = -1;//且直连没有下一跳
	}
}
void Merge(int x, int y,int Time) {//RIP路由表融合(Rx->Ry)
	for (int i = 1; i <= 10; i++) {//将Rx和Ry的网络1-10分别比较
		int dX = R[x].net[i].d, dY = R[y].net[i].d;
		int nX = R[x].net[i].nextR, nY = R[y].net[i].nextR;
		bool flag = false;//false-不需更新 true-更新
		if (dX < 16 && dY == 17) flag = true;//①新的直接进来(Rx可达i,Ry不得达)
		else if (nX != nY&&dX < dY) flag = true;//②下一跳不一样的,取短的进表(nextR不同,取d较小)
		else if (nX == nY&&R[x].time[i] > R[y].time[i]) {//③下一跳一样的,要最新的(nextR相同,取time较大)
			R[y].net[i].d = dX;
			R[y].net[i].nextR = y;
			R[y].time[i] = R[x].time[i];
		}
		if (flag) {//更新
			R[y].net[i].d = dX + 1;
			R[y].net[i].nextR = x;
			R[y].time[i] = Time;
		}
		if (Time - R[y].time[i] > 6) {//若超过180秒未更新,则该路由项记为无效
			R[y].net[i].d = 16;//距离不可达
			R[y].net[i].nextR = -1;
		}
	}
}
void updata(int index,int Time) {//递归更新路由
	if (index < 1 || index>10) return;//超出路由范围return
	if (index < 10) {//向右传递更新
		Merge(index, index + 1, Time);//RIP路由表融合
		if (!Rout[index + 1]) {
			Rout[index + 1] = true;//设置已更新过
			updata(index + 1, Time);//更新相邻路由
		}
	}
	if (index > 1) {//向左传递更新
		Merge(index, index - 1, Time);//RIP路由表融合
		if (!Rout[index - 1]) {
			Rout[index - 1] = true;//设置已更新过
			updata(index - 1, Time);//更新相邻路由
		}
	}
}
void print(int x) {//打印查询的路由表
	bool flag = false;
	for (int i = 1; i < 16; i++) {
		if (R[x].net[i].d <= 16) {
			if (!flag) {
				flag = true;
				cout << "路由表R" << x << "如下:" << endl << "网络号\t\t" << "距离\t\t" << "下一跳" << endl;
			}
			cout << i << "\t\t" << R[x].net[i].d << "\t\t";
			if (R[x].net[i].nextR != -1 && R[x].net[i].nextR != x) cout << "R" << R[x].net[i].nextR << endl;
			else cout << "—"<< endl;//直连或不可达
		}
	}
	if (!flag) cout << "路由表R" << x << "为空!" << endl;
	cout << endl;
}
void wait(int second) {//等待second秒后继续运行
	clock_t end;
	end = clock() + second*CLOCKS_PER_SEC;
	while (clock() < end) NULL;
}

int main() {
	int x, n;//临时存放路由表Rx和网络n
	InitRouteTable();//初始化路由表
	cout << "初始路由表情况如下所示:" << endl;
	for (x = 1; x <= 10; x++) {
		print(x);
	}
	cout << "路由表更新开始:" << endl;
	for (int Time = 1; Time <= 10; Time++) {
		cout << endl << "第" << Time << "次更新后:" << endl;
		memset(Rout, 0, sizeof(Rout));//设置每个路由表只更新一次
		updata(1, Time);//从R1开始更新路由表

		cout << "输入想要查询的路由表Rx(1-10):(输入0退出查询)" << endl;
		while (cin >> x&&x) {
			if (x < 0 || x>10) cout << "路由器R" << x << "不存在!" << endl;
			else print(x);//打印当前查询的路由表
		}

		cout << "输入因意外临时断开的路由Rx和网络n:(Rx=0表示此次不断网络)" << endl;
		cin >> x >> n;
		R[x].net[n].d = 16;//设置Rx->网络n不可达
		R[x].net[n].nextR = x;//设置下一跳为自己
		R[x].time[n] = Time + 1;//设置断开为最新变化
		updata(x, Time);//若路由表变化,向所有相邻路由器发送更新报文

		if (x != 0) {//若网络意外断开
			cout << "断开后已立即更新相邻路由表,输入想要查询的路由表Rx(1-10):(输入0退出查询)" << endl;
			while (cin >> x&&x) {
				if (x < 0 || x>10) cout << "路由器R" << x << "不存在!" << endl;
				else print(x);//打印当前查询的路由表
			}
		}
		cout << "查询结束,30秒后更新......" << endl;
		wait(3);//每30秒更新一次并查看(30秒略长修改为3秒)
	}
	return 0;
}

 

你可能感兴趣的:(计算机网络,C++算法)