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

news2024/9/27 9:26:03

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博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1364199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux第18步_安装“Ubuntu系统下的C语言编译器GCC”

Ubuntu系统没有提供C/C的编译环境&#xff0c;因此还需要手动安装build-essential软件包&#xff0c;它包含了 GNU 编辑器&#xff0c;GNU 调试器&#xff0c;和其他编译软件所必需的开发库和工具。本节用于重点介绍安装“Ubuntu系统下的C语言编译器&#xff27;&#xff23;&a…

如何解决找不到mfc100u.dll无法运行程序问题,分享四种靠谱的方法

在日常使用电脑的过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是找不到mfc100u.dll的困扰。这个问题主要是因为mfc100u.dll是Microsoft Foundation Class&#xff08;MFC&#xff09;库中的一个版本特定的DLL文件&#xff0c;它是Visual Studio 2010及更早…

java 音乐会售票平台系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java 音乐会售票平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助struts2框架开发mvc模式&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发 环境为TOCAT7.0,Myeclipse8.5开发&#xff0c;数据…

Video classification with UniFormer基于统一分类器的视频分类

本文主要介绍了UniFormer: Unified Transformer for Efficient Spatial-Temporal Representation Learning 代码&#xff1a;https://github.com/Sense-X/UniFormer/tree/main/video_classification UNIFormer 动机 由于视频具有大量的局部冗余和复杂的全局依赖关系&#xf…

企业一线员工定岗定编全解析

引言&#xff1a;在生产制造企业中&#xff0c;由于一线员工工作内容单一&#xff0c;与产量线性关系明显&#xff0c;因此针对一线员工的定编方法最简单有效的就是通过数据计算的方式。人力资源专家——华恒智信根据多年以来对生产制造企业定岗定编的关注与研究得出的经验&…

第7章-第5节-Java中的比较器comparator和泛型的简单说明

1、 引入 上个章节中我们在使用TreeSet保存自定义数据类型的时候&#xff0c;类必须要实现Comparable这个接口&#xff0c;然后重写CompareTo这个方法&#xff0c;这个必须是在具体的自定义类内部去写&#xff0c;有时不方便&#xff0c;每遇到一个都要在那个类内部去写这个Co…

如何把电脑中的项目快速传进Github中?

一、打开GitHub网站:https:github.com 登录自己的个人账号 1.新建一个项目 2.用鼠标直接拖拽电脑中的项目文件夹与文件到新创建的项目中点击保存即可。

Xfs文件系统磁盘布局

目录 一&#xff0c;CentOS下Xfs文件系统的安装 二&#xff0c;准备工作 三&#xff0c;AG结构 四&#xff0c;AG超级块 五&#xff0c;AG空闲磁盘空间管理 六&#xff0c;ABTB的Btree 七&#xff0c;ABTB/ABTC的节点块管理 八&#xff0c;inode节点管理 九&#xff0…

Redis 键中冒号的用途是什么?可以使匹配查询更快吗?

Redis 键中冒号的用途是什么在Redis中&#xff0c;冒号&#xff08;:&#xff09;用作键的分隔符&#xff0c;它的主要作用是创建层次结构和命名空间。通过在键中使用冒号&#xff0c;可以将键分为多个部分&#xff0c;从而更好地组织和管理数据。 以下是冒号在Redis键中的用途…

PyTorch|构建自己的卷积神经网络——卷积层

在构建我们的网络时&#xff0c;我们需要用到卷积层提取特征&#xff0c;来看到一些特别的东西&#xff0c;当图片经过卷积层&#xff0c;图片尺寸一般会变化。 当我们构建网络时&#xff0c;我们需要确定各个层的参数&#xff0c;而这些参数&#xff0c;则是要提前计算的&…

【Python常用函数】一文让你彻底掌握Python中的numpy.append函数

大数据时代的到来,使得很多工作都需要进行数据挖掘,从而发现更多有利的规律,或规避风险,或发现商业价值。而大数据分析的基础是学好编程语言。本文和你一起来探索Python中的append函数,让你以最短的时间明白这个函数的原理。也可以利用碎片化的时间巩固这个函数,让你在处…

【数据分享】2024年我国主要城市地铁站点和线路数据

地铁站点与线路数据是我们经常会用到的一种基础数据。去哪里获取该数据呢&#xff1f; 今天我们就给大家分享一份2024年1月采集的全国有地铁城市的地铁站点与线路数据&#xff0c;数据格式为shp&#xff0c;数据坐标为wgs1984地理坐标。数据中不仅包括地铁&#xff0c;也包括轻…

软件测试|深入理解SQL RIGHT JOIN:语法、用法及示例解析

引言 在SQL中&#xff0c;JOIN是一种重要的操作&#xff0c;用于将两个或多个表中的数据关联在一起。SQL提供了多种JOIN类型&#xff0c;其中之一是RIGHT JOIN。RIGHT JOIN用于从右表中选择所有记录&#xff0c;并将其与左表中匹配的记录组合在一起。本文将深入探讨SQL RIGHT …

x-cmd pkg | you-get - web 媒体内容下载工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 You-Get 是一个开源的命令行小型下载工具&#xff0c;用于从各种网站下载视频、音频和其他媒体文件。 它可以解析和下载嵌套在网页中的媒体&#xff0c;能从 YouTube、优酷、Niconico 、bilibili 等热门网站下载视频、…

leetcode:1108. IP 地址无效化

一、题目 二、函数原型 char* defangIPaddr(char* address) 三、思路 本题通俗来讲就是将字符串中的 . 替换为 [.] 先遍历字符串得出有num个 . 且申请 len 2*num 1 个char空间ans。len是原字符串长度&#xff0c;2*num是[ ]的个数&#xff0c;1是 ‘ \0 ’ 的空间。 …

STL——vector详解

目录 &#x1f4a1;基本概念 &#x1f4a1;存放内置数据类型 &#x1f4a1;存放自定义数据类型 &#x1f4a1;存放自定义数据类型指针 &#x1f4a1;vector容器嵌套容器 &#x1f4a1;vector构造函数 &#x1f4a1;vector赋值操作 &#x1f4a1;vector容量和大小 &…

Linux基础命令@grep、wc、管道符

目录 grep概念语法作用演示一演示二演示三&#xff0c;带选项 -n wc概念语法作用wc&#xff0c;不带选项-c&#xff0c;统计字节数-m&#xff0c;统计字符数-l&#xff0c;统计行数-w&#xff0c;统计单词数 管道符语法作用演示一演示二演示三演示四演示五 总结 grep 概念 gre…

十一、工具盒类(MyQQ)(Qt5 GUI系列)

目录 ​编辑 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 抽屉效果是软件界面设计中的一种常用形式&#xff0c;可以以一种动态直观的方式在有限大小的界面上扩展出更多的功能。本例要求实现类似 QQ 抽屉效果。 二、实现代码 #include "dialog.…

web前端开发技术复习问答题

目录 1.简述常见单标签和双标签有哪些&#xff1f; 2.常见块级元素和行级元素有哪些&#xff1f; 3.简述常见的列表有哪些&#xff1f;他们有什么区别&#xff1f; 4.简述超链接的href属性值如何设置&#xff1f;有什么区别 5.CSS基本语法 6. css中常见的引入方式有几种&…

共聘猫品牌创始人杨涛宾:从海关到人力资源行业的华丽转身

专访山东共聘猫教育科技集团董事长杨涛宾 2024新年的第一次人物专访&#xff0c;我们来到山东济南。大力财经的采访对象是创业者杨涛宾&#xff0c;他是山东共聘猫教育科技集团董事长&#xff0c;也是共聘猫品牌创始人和主要打造者。 我们面前的杨涛宾外表朴实&#xff0c;举…