参考计算机网络教材 164 页 OSPF 路由协议工作原理,在此基础上,实现一个简单的原型系统。主 要完成工作有:路由节点泛洪发布本地节点的链路信息,其它节点接收信息,构造网络拓扑,然后利 用 Dijkstra(或 Floyd)算法计算出到其它节点的最短路径,最后生成本节点的路由表。设计可以以下 图为例,其中 a 图是一个 6 节点的网络,每个节点生成自己的链路状态包(图 b),然后将其扩散至其 他节点。
在这里我们使用Floyd动态归划算法。
//Coder:MGJ
//Time:2024.1.4
#include
#include
using namespace std;
#define INF 0x3f3f3f3f
const int maxx = 1e3 + 7;
int G[maxx][maxx];//存图数组
int path[maxx][maxx];//path[i][j]记录从i到j经过了那个点过来的
int n;//节点数
void init() {
memset(G, INF, sizeof G);//初始化数组
memset(path, -1, sizeof path);
for (int i = 0; i < maxx; i++)//到自己的距离为0
G[i][i] = 0;
}
void Floyd() { //三重循环
for (int k = 1; k <= n; k++) { //选中的中间值
for (int i = 1; i <= n; i++) { //数组横坐标
for (int j = 1; j <= n; j++) { //数组纵坐标
if (G[i][j] > G[i][k] + G[k][j]) { //如果以k中间点为中间点检测到路径更短
G[i][j] = G[i][k] + G[k][j]; //更新路径值
path[i][j] = k; //更新要经过的中间点
}
}
}
}
}
void ptf(int u, int v) {
cout << u << "->";
while (path[u][v] != -1) {
u = path[u][v];
cout << u << "->";
}
cout << v << endl;
}
void init_data() {
int demo_Data[6][6] = {
{0, 4, INF, INF, 5, INF},
{4, 0, 2, INF, INF, 6},
{INF, 2, 0, 3, 1, INF},
{INF, INF, 3, 0, INF, 7},
{5, INF, 1, INF, 0, 8},
{INF, 6, INF, 7, 8, 0}
};
for (int i = 0; i <=5; ++i) {
for (int j = 0; j <= 5; ++j) {
G[i][j] = demo_Data[i][j];
}
}
}
int main() {
char Demo_need_input = 'n';
int x, y, z, need_x, need_y;
char End_input;
init();//初始化
cout << " *============ OSPF 路由协议原型系统设计与实现 =============*" << endl;
cout << "是否使用Demo数据(y|n)", cin >> Demo_need_input;
if (Demo_need_input == 'n') {
cout << "请输入路由节点数:", cin >> n;
do {
cout << "请输入起始路由节点(0-" << n - 1 << "):", cin >> x;
cout << "请输入结束路由节点(0-" << n - 1 << "):", cin >> y;
cout << "请输入结束路由节点" << x << "到" << y << "的距离(双向):", cin >> z;
G[x][y] = z;
G[y][x] = z;
cout << "是否继续输入(y|n):", cin >> End_input;
} while (End_input == 'y');
} else{
init_data();
n=6;
}
cout << "\n 距离表为:---------------------------------------------" << endl;
for (int i = 0; i < n; i++)//i对行进行循环
{
cout<<"\t";
for (int j = 0; j < n; j++)//j对列进行循环
{
if (G[i][j] >= INF)
printf(" %4s ","*");
else
printf(" %4d ", G[i][j]);
}
printf("\n");//第一列循环完之后进行换行
}
cout << " -----------------------------------------------------" << endl;
Floyd();
cout << "请输入查询的起始路由(0-" << n - 1 << "):", cin >> need_x;
cout << "请输入查询的结束路由(0-" << n - 1 << "):", cin >> need_y;
cout << "\n计算结果如下:" << endl;
if (G[need_x][need_y] >= INF) {
cout << " *该两个网络没有直接或间接连接*" << endl;
} else {
ptf(need_x, need_y);
cout << "\n最短距离为:" << G[need_x][need_y] << endl;//输出点1到点n的最短距离
}
system("pause");
return 0;
}
点个关注吧
2024 HNUST计算机网络课程设计-(ᕑᗢᓫ∗)˒芒果酱-参考文章
(代码可以参考,૮₍ ˃ ⤙ ˂ ₎ა 但同学们要认真编写哦)
-------------------------------------------------------------------------
1、网络聊天程序的设计与实现
C++ Socket 多线程 网络聊天室 支持用户端双向交流(2023)-CSDN博客
2、Tracert 与 Ping 程序设计与实现
Tracert 与 Ping 程序设计与实现(2024)-CSDN博客
3、滑动窗口协议仿真
滑动窗口协议仿真(2024)-CSDN博客
4、OSPF 路由协议原型系统设计与实现
OSPF 路由协议原型系统设计与实现-CSDN博客
5、基于 IP 多播的网络会议程序
基于 IP 多播的网络会议程序(2024)-CSDN博客
6、编程模拟 NAT 网络地址转换
编程模拟 NAT 网络地址转换(2024)-CSDN博客
7、网络嗅探器的设计与实现
网络嗅探器的设计与实现(2024)-转载-CSDN博客
8、网络报文分析程序的设计与实现
网络报文分析程序的设计与实现(2024)-CSDN博客
9、简单 Web Server 程序的设计与实现
简单 Web Server 程序的设计与实现 (2024)-CSDN博客
10、路由器查表过程模拟计算机网络 - 路由器查表过程模拟 C++(2024)-CSDN博客