计算机网络 - 路由器查表过程模拟 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 恢复时间:࿱…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...