1.题目描述
参考计算机网络教材 164 页 OSPF 路由协议工作原理,在此基础上,实现一个简单的原型系统。主 要完成工作有:路由节点泛洪发布本地节点的链路信息,其它节点接收信息,构造网络拓扑,然后利 用 Dijkstra(或 Floyd)算法计算出到其它节点的最短路径,最后生成本节点的路由表。设计可以以下 图为例,其中 a 图是一个 6 节点的网络,每个节点生成自己的链路状态包(图 b),然后将其扩散至其 他节点。
在这里我们使用Floyd动态归划算法。
2.程序Demo
3.参考代码
//Coder:MGJ
//Time:2024.1.4
#include <iostream>
#include <cstring>
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++)//到自己的距离为0G[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 ","*");elseprintf(" %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博客