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

1.题目描述

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

fefbd8cb314a4b83920f06e6f14b73fb.png

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


2.程序Demo

47c0cbd2119d47b7a4a84e7e90cf8d44.png


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

 

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值