OSPF 路由协议原型系统设计与实现

1.题目描述

参考计算机网络教材 164 页 OSPF 路由协议工作原理,在此基础上,实现一个简单的原型系统。主 要完成工作有:路由节点泛洪发布本地节点的链路信息,其它节点接收信息,构造网络拓扑,然后利 用 Dijkstra(或 Floyd)算法计算出到其它节点的最短路径,最后生成本节点的路由表。设计可以以下 图为例,其中 a 图是一个 6 节点的网络,每个节点生成自己的链路状态包(图 b),然后将其扩散至其 他节点。

在这里我们使用Floyd动态归划算法


2.程序Demo


3.参考代码

cpp 复制代码
//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++)//到自己的距离为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博客

相关推荐
代码雕刻家19 分钟前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain19 分钟前
算法 | 位运算(哈希思想)
算法
Kalika0-02 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20242 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh4 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
Tisfy4 小时前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
Mephisto.java4 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli4 小时前
滑动窗口->dd爱框框
算法
丶Darling.4 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo5205 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法