计算机网络 - 路由器查表过程模拟 C++(2024)
1.题目描述
参考计算机网络教材 140 页 4.3 节内容,编程模拟路由器查找路由表的过程,用(目的地址 掩码 下一跳) 的 IP 路由表以及目的地址作为输入,为目的地址查找路由表,找出正确的下一跳并输出结果。
1.当目的地址为128.96.39.10时下一跳
同子网掩码255.255.255.128做与运算可得128.96.39.0 故接口m0转发
2.当目的地址为128.96.40.12 时下一跳
同子网掩码255.255.255.128做与运算可得128.96.40.0故接口R2转发
3.当目的地址为128.96.40.151 时下一跳
同子网掩码255.255.255.128做与运算可得128.96.40.128,同子网掩码255.255.255.192做与运算可得128.96.40.128,而此时没有目的网络,故通过默认网关进行转发下一跳为R4。
4.当目的地址为192.4.153.17时下一跳
同子网掩码255.255.255.128做与运算可得 192.4.153.0 但此时子网掩码(255.255.255.128)中对应的目的地址没有192.4.153.0。同子网掩码255.255.255.192做运算可得192.4.153.0.故此时通过R3进行转发。
2.程序Demo
其他功能自行探索(Doge)
3.参考代码
//time:2024.1.4
//coder:MGJ//注意
//https://baijiahao.baidu.com/s?id=1683531102064675651
//Demo题目#include <iostream>
#include <conio.h>
#include <windows.h>
#include <vector>
#include <sstream>using namespace std;
//菜单功能数量
#define MENUNUMS1 4
//路由表最大数量
#define Router_max_num 128//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//函数声明
void cls();void Init_data();int Menuchoose1();void Menushow1(int i);void Function_Select(int select);void Net_address_translation();void Net_address_add();void Net_address_delect();void Net_address_revise();void Stringsplit(string str, const char split, vector<string> &res);void Net_Map_Show();//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//路由表
struct Router_Map {//目的网络地址,子网掩码,下一跳int Destination_network_address[4] = {0};int Subnet_mask[4] = {0};string Next_hop;BOOLEAN Init_Router_Map(string ip,string mask,string Next_hop){if (ip=="n"|| mask=="n"||Next_hop=="n") return false;Set_Router_Map_Destination_add(ip);Set_Router_Map_mask_add(mask);this->Next_hop=Next_hop;return true;}void Set_Router_Map_Destination_add(string ip) {vector<string> strList;int num = 0, i = 0;Stringsplit(ip, '.', strList); // 将子串存放到strList中for (auto str_num: strList) {istringstream ss(str_num);ss >> num;Destination_network_address[i++] = num;}}void Set_Router_Map_mask_add(string mask) {vector<string> strList;int num = 0, i = 0;Stringsplit(mask, '.', strList); // 将子串存放到strList中for (auto str_num: strList) {istringstream ss(str_num);ss >> num;Subnet_mask[i++] = num;}}
};Router_Map Router_Map_Data[Router_max_num];//用来存储表
int Now_Router_Num = 0;//当前的表大小
//----------------------------------------------------------------------------------
//主函数
int main() {int out = 0;Init_data();while (true) {out = Menuchoose1();Function_Select(out);}
}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//初始化函数
void Init_data() {//0位为默认网络/外部网络(必须有)Router_Map_Data[0].Init_Router_Map("0.0.0.0" ,"255.255.255.255","R4");//下面可以自行修改添加Router_Map_Data[1].Init_Router_Map("128.96.39.0" ,"255.255.255.128","接口M0");Router_Map_Data[2].Init_Router_Map("128.96.39.128","255.255.255.128","接口M1");Router_Map_Data[3].Init_Router_Map("128.96.40.0" ,"255.255.255.128","R2");Router_Map_Data[4].Init_Router_Map("192.4.153.0" ,"255.255.255.192","R3");Now_Router_Num = 4;//1-4 输入的项数
}//选择函数
int Menuchoose1() {int ch, i = 0;Menushow1(0);while (true) {if (_kbhit()) {ch = _getch();if (ch == 80) {//循环i = (++i) % MENUNUMS1;Menushow1(i);} else if (ch == 72) {//循环防止出现负数i = ((--i) + MENUNUMS1) % MENUNUMS1;Menushow1(i);} else if (ch == 13) return i + 1;}}
}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//菜单显示
void Menushow1(int i) {cls();SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout << "\n *===== 路由器查表过程模拟 Demo=====*\n";if (i == 0)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED);cout << " ->>>查询地址去向<<<- " << endl;if (i == 1)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED);if (i == 0)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout << " ->>>增加路由地址<<<- " << endl;if (i == 2)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED);if (i == 1)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout << " ->>>删除路由地址<<<- " << endl;if (i == 3)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED);if (i == 2)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout << " ->>>修改路由地址<<<- " << endl;if (i == 3)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout << " -------------------------------------\n";
}//功能函数
void Function_Select(int select) {Net_Map_Show();switch (select) {case 1: {Net_address_translation();break;}case 2: {Net_address_add();break;}case 3: {Net_address_delect();break;}case 4: {Net_address_revise();break;}}system("pause");system("cls");
}
void Net_Map_Show() {cout << "\t序号\t目的地址\t\t掩码\t\t下一跳" << endl;for (int i = 0; i <= Now_Router_Num; ++i) {cout << " \t "<<i<<"\t";for (int j = 0; j < 4; ++j) {cout << Router_Map_Data[i].Destination_network_address[j];j != 3 ? cout << "." : cout << " \t";}for (int j = 0; j < 4; ++j) {cout << Router_Map_Data[i].Subnet_mask[j];j != 3 ? cout << "." : cout << "\t\t";}cout << Router_Map_Data[i].Next_hop << endl;}
}
void Net_address_translation() {int Input_Destination[4] = {0};int Get_Destination[4] = {0};int Cal_num = 0;int Find_Local = 0;cout << "\n请输入查询的目的地址(如:128.96.39.10):";scanf("%d.%d.%d.%d", &Input_Destination[0], &Input_Destination[1], &Input_Destination[2], &Input_Destination[3]);for (int i = 1; i <= Now_Router_Num; ++i) {Cal_num = 0;for (int j = 0; j < 4; ++j) {Get_Destination[j] = Router_Map_Data[i].Subnet_mask[j] & Input_Destination[j];Cal_num = Cal_num + (Router_Map_Data[i].Destination_network_address[j] - Get_Destination[j]);}if (Cal_num == 0) {Find_Local = i;break;}}cout << endl << " -------------------------------------------" << endl;cout << " 计算出的目的地址为:";for (int j = 0; j < 4; ++j) {cout << Get_Destination[j];j != 3 ? cout << "." : cout << "\n";}cout << " 下一跳为: " << Router_Map_Data[Find_Local].Next_hop << endl;cout << " -------------------------------------------" << endl;
}void Net_address_add() {string input_Destination;string input_Subnet_mask;string input_Next_hop;cout << endl << " -------------(输入n可取消当前操作)-------------" << endl;cout<<" 请输入需要添加的目的网络:",cin>>input_Destination;cout<<" 请输入需要添加的网络掩码:",cin>>input_Subnet_mask;cout<<" 请输入需要添加的下一跳:",cin>>input_Next_hop;cout << endl << " -------------------------------------------" << endl;if(Router_Map_Data[Now_Router_Num+1].Init_Router_Map(input_Destination,input_Subnet_mask,input_Next_hop))Now_Router_Num++;
}void Net_address_delect() {cout << " * 不想开发数组的删除与移动捏(doge), 请尝试修改吧" << endl;
}void Net_address_revise() {string input_Destination;string input_Subnet_mask;string input_Next_hop;int input_num;cout << endl << " -------------(输入n可取消当前操作)-------------" << endl;cout<<" 请输入需要修改的项序号(0-"<<Now_Router_Num<<"):",cin>>input_num;cout<<" 请输入修改的目的网络:",cin>>input_Destination;cout<<" 请输入修改的网络掩码:",cin>>input_Subnet_mask;cout<<" 请输入修改的下一跳:",cin>>input_Next_hop;cout << " -------------------------------------------" << endl;Router_Map_Data[input_num].Init_Router_Map(input_Destination,input_Subnet_mask,input_Next_hop);
}//清屏函数
void cls() {COORD pos;HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);pos.Y = pos.X = 0;SetConsoleCursorPosition(hOut, pos);
}//Stringsplit
void Stringsplit(string str, const char split, vector<string> &res) {istringstream iss(str); // 输入流string token; // 接收缓冲区while (getline(iss, token, split)) // 以split为分隔符{res.push_back(token);}
}
点个关注吧哈哈
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博客
相关文章:

计算机网络 - 路由器查表过程模拟 C++(2024)
1.题目描述 参考计算机网络教材 140 页 4.3 节内容,编程模拟路由器查找路由表的过程,用(目的地址 掩码 下一跳) 的 IP 路由表以及目的地址作为输入,为目的地址查找路由表,找出正确的下一跳并输出结果。 1.…...

实现pytorch版的mobileNetV1
mobileNet具体细节,在前面已做了分析记录:轻量化网络-MobileNet系列-CSDN博客 这里是根据网络结构,搭建模型,用于图像分类任务。 1. 网络结构和基本组件 2. 搭建组件 (1)普通的卷积组件:CBL …...
vue多tab页面全部关闭后自动退出登录
业务场景:主项目是用vue写的单页面应用,但是有多开页面的需求,现在需要在用户关闭了所有的浏览器标签页面后,自动退出登录。 思路:因为是不同的tab页面,我只能用localStorage来通信,新打开一个…...
记一个集群环境部署不完整导致的BUG
一 背景 产品有三个环境:开发测试环境、验收环境、生产环境。 开发测试环境,保持最新的更新; 验收环境,阶段待发布内容; 生产环境,部署稳定内容。 产品为BS架构,后端采用微服务…...
Go zero copy,复制文件
这里使用零拷贝技术复制文件,从内核态操作源文件和目标文件。避免了在用户态开辟缓冲区,然后从内核态复制文件到用户态的问题。 由内核态完成文件复制操作。 调用的是syscall.Sendfile系统调用函数。 //go:build linuxpackage zero_copyimport ("f…...
http协议九种请求方法介绍及常见状态码
http1.0定义了三种: GET: 向服务器获取资源,比如常见的查询请求POST: 向服务器提交数据而发送的请求Head: 和get类似,返回的响应中没有具体的内容,用于获取报头 http1.1定义了六种 PUT:一般是用于更新请求,…...

详解flink exactly-once和两阶段提交
以下是我们常见的三种 flink 处理语义: 最多一次(At-most-Once):用户的数据只会被处理一次,不管成功还是失败,不会重试也不会重发。 至少一次(At-least-Once):系统会保…...
Qt/QML编程学习之心得:QDbus实现service接口调用(28)
D-Bus协议用于进程间通讯的。 QString value = retrieveValue();QDBusPendingCall pcall = interface->asyncCall(QLatin1String("Process"), value);QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this);QObject::connect(watcher, SI…...

前端nginx配置指南
前端项目发布后,有些接口需要在服务器配置反向代理,资源配置gzip压缩,配置跨域允许访问等 配置文件模块概览 配置示例 反向代理 反向代理是Nginx的核心功能之一,是指客户端发送请求到代理服务器,代理服务器再将请求…...

接口测试到底怎么做,5分钟时间看完这篇文章彻底搞清楚
01、通用的项目架构 02、什么是接口 接口:服务端程序对外提供的一种统一的访问方式,通常采用HTTP协议,通过不同的url,不同的请求类型(GET、POST),不同的参数,来执行不同的业务逻辑。…...

显示管理磁盘分区 fdisk
显示管理磁盘分区 fdisk fdisk是用于检查一个磁盘上分区信息最通用的命令。 fdisk可以显示分区信息及一些细节信息,比如文件系统类型等。 设备的名称通常是/dev/sda、/dev/sdb 等。 对于以前的设备有可能还存在设备名为 /dev/hd* (IDE)的设备,这个设…...

Hyperledger Fabric 管理链码 peer lifecycle chaincode 指令使用
链上代码(Chaincode)简称链码,包括系统链码和用户链码。系统链码(System Chaincode)指的是 Fabric Peer 中负责系统配置、查询、背书、验证等平台功能的代码逻辑,运行在 Peer 进程内,将在第 14 …...
L1-011 A-B(Java)
题目 本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。 输入格式: 输入在2行中先后给出字符串A和B。两字符串的长度都不超过10的四次方,并且…...

系列七、Ribbon
一、Ribbon 1.1、概述 Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,是Netflix发布的一款开源项目,其主要功能是提供客户端的软件负载均衡算法和服务调用,Ribbon客户端组件提供一系列完善的配置项,例如:…...

山东名岳轩印刷包装携专业包装袋盛装亮相2024济南生物发酵展
山东名岳轩印刷包装有限公司盛装亮相2024第12届国际生物发酵展,3月5-7日山东国际会展中心与您相约! 展位号:1号馆F17 山东名岳轩印刷包装有限公司是一家拥有南北两个生产厂区,设计、制版、印刷,营销策划为一体的专业…...
BGP公认必遵属性——Next-hop(一)
BGP公认必遵属性共有三个,分别是:Next-hop、Origin、As-path,本期介绍Next-hop 点赞关注,持续更新!!! Next-hop 华为BGP路由下一跳特点: 默认情况下传给EBGP邻居的BGP路由的下一跳…...

增强Wi-Fi信号的10种方法,值得去尝试
Wi-Fi信号丢失,无线盲区。在一个对一些人来说,上网和呼吸一样必要的世界里,这些问题中的每一个都令人抓狂。 如果你觉得你的Wi-Fi变得迟钝,有很多工具可以用来测试你的互联网速度。你还可以尝试一些技巧来解决网络问题。然而,如果你能获得良好接收的唯一方法是站在无线路…...
第十五章 ECMAScript6新增的常用语法
文章目录 一、声明关键字二、箭头函数三、解构赋值四、展开运算符五、对字符的补充六、Symbol七、对象的简写语法八、Set和Map九、for-of 一、声明关键字 ES6新增的声明关键字: let,const:声明变量class:声明类import,…...

vulhub中的Apache SSI 远程命令执行漏洞
Apache SSI 远程命令执行漏洞 1.cd到ssi-rce cd /opt/vulhub/httpd/ssi-rce/ 2.执行docker-compose up -d docker-compose up -d 3.查看靶场是否开启成功 dooker ps 拉取成功了 4.访问url 这里已经执行成功了,注意这里需要加入/upload.php 5.写入一句话木马 &…...

MSB20M-ASEMI迷你贴片整流桥MSB20M
编辑:ll MSB20M-ASEMI迷你贴片整流桥MSB20M 型号:MSB20M 品牌:ASEMI 封装:UMSB-4 特性:贴片、整流桥 最大平均正向电流:2A 最大重复峰值反向电压:1000V 恢复时间:࿱…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...

STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...

【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...