当前位置: 首页 > news >正文

计算机网络 - 路由器查表过程模拟 C++(2024)

1.题目描述

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

4f0bf7cb877a49c9b462a487e69c9bc7.png

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

0aa0a9c704204bd296effffd2518e033.png

其他功能自行探索(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 节内容&#xff0c;编程模拟路由器查找路由表的过程&#xff0c;用&#xff08;目的地址 掩码 下一跳&#xff09; 的 IP 路由表以及目的地址作为输入&#xff0c;为目的地址查找路由表&#xff0c;找出正确的下一跳并输出结果。 1.…...

实现pytorch版的mobileNetV1

mobileNet具体细节&#xff0c;在前面已做了分析记录&#xff1a;轻量化网络-MobileNet系列-CSDN博客 这里是根据网络结构&#xff0c;搭建模型&#xff0c;用于图像分类任务。 1. 网络结构和基本组件 2. 搭建组件 &#xff08;1&#xff09;普通的卷积组件&#xff1a;CBL …...

vue多tab页面全部关闭后自动退出登录

业务场景&#xff1a;主项目是用vue写的单页面应用&#xff0c;但是有多开页面的需求&#xff0c;现在需要在用户关闭了所有的浏览器标签页面后&#xff0c;自动退出登录。 思路&#xff1a;因为是不同的tab页面&#xff0c;我只能用localStorage来通信&#xff0c;新打开一个…...

记一个集群环境部署不完整导致的BUG

一 背景 产品有三个环境&#xff1a;开发测试环境、验收环境、生产环境。 开发测试环境&#xff0c;保持最新的更新&#xff1b; 验收环境&#xff0c;阶段待发布内容&#xff1b; 生产环境&#xff0c;部署稳定内容。 产品为BS架构&#xff0c;后端采用微服务&#xf…...

Go zero copy,复制文件

这里使用零拷贝技术复制文件&#xff0c;从内核态操作源文件和目标文件。避免了在用户态开辟缓冲区&#xff0c;然后从内核态复制文件到用户态的问题。 由内核态完成文件复制操作。 调用的是syscall.Sendfile系统调用函数。 //go:build linuxpackage zero_copyimport ("f…...

http协议九种请求方法介绍及常见状态码

http1.0定义了三种&#xff1a; GET: 向服务器获取资源&#xff0c;比如常见的查询请求POST: 向服务器提交数据而发送的请求Head: 和get类似&#xff0c;返回的响应中没有具体的内容&#xff0c;用于获取报头 http1.1定义了六种 PUT&#xff1a;一般是用于更新请求&#xff0c;…...

详解flink exactly-once和两阶段提交

以下是我们常见的三种 flink 处理语义&#xff1a; 最多一次&#xff08;At-most-Once&#xff09;&#xff1a;用户的数据只会被处理一次&#xff0c;不管成功还是失败&#xff0c;不会重试也不会重发。 至少一次&#xff08;At-least-Once&#xff09;&#xff1a;系统会保…...

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配置指南

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

接口测试到底怎么做,5分钟时间看完这篇文章彻底搞清楚

01、通用的项目架构 02、什么是接口 接口&#xff1a;服务端程序对外提供的一种统一的访问方式&#xff0c;通常采用HTTP协议&#xff0c;通过不同的url&#xff0c;不同的请求类型&#xff08;GET、POST&#xff09;&#xff0c;不同的参数&#xff0c;来执行不同的业务逻辑。…...

显示管理磁盘分区 fdisk

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

Hyperledger Fabric 管理链码 peer lifecycle chaincode 指令使用

链上代码&#xff08;Chaincode&#xff09;简称链码&#xff0c;包括系统链码和用户链码。系统链码&#xff08;System Chaincode&#xff09;指的是 Fabric Peer 中负责系统配置、查询、背书、验证等平台功能的代码逻辑&#xff0c;运行在 Peer 进程内&#xff0c;将在第 14 …...

L1-011 A-B(Java)

题目 本题要求你计算A−B。不过麻烦的是&#xff0c;A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉&#xff0c;剩下的字符组成的就是字符串A−B。 输入格式&#xff1a; 输入在2行中先后给出字符串A和B。两字符串的长度都不超过10的四次方&#xff0c;并且…...

系列七、Ribbon

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

山东名岳轩印刷包装携专业包装袋盛装亮相2024济南生物发酵展

山东名岳轩印刷包装有限公司盛装亮相2024第12届国际生物发酵展&#xff0c;3月5-7日山东国际会展中心与您相约&#xff01; 展位号&#xff1a;1号馆F17 山东名岳轩印刷包装有限公司是一家拥有南北两个生产厂区&#xff0c;设计、制版、印刷&#xff0c;营销策划为一体的专业…...

BGP公认必遵属性——Next-hop(一)

BGP公认必遵属性共有三个&#xff0c;分别是&#xff1a;Next-hop、Origin、As-path&#xff0c;本期介绍Next-hop 点赞关注&#xff0c;持续更新&#xff01;&#xff01;&#xff01; Next-hop 华为BGP路由下一跳特点&#xff1a; 默认情况下传给EBGP邻居的BGP路由的下一跳…...

增强Wi-Fi信号的10种方法,值得去尝试

Wi-Fi信号丢失,无线盲区。在一个对一些人来说,上网和呼吸一样必要的世界里,这些问题中的每一个都令人抓狂。 如果你觉得你的Wi-Fi变得迟钝,有很多工具可以用来测试你的互联网速度。你还可以尝试一些技巧来解决网络问题。然而,如果你能获得良好接收的唯一方法是站在无线路…...

第十五章 ECMAScript6新增的常用语法

文章目录 一、声明关键字二、箭头函数三、解构赋值四、展开运算符五、对字符的补充六、Symbol七、对象的简写语法八、Set和Map九、for-of 一、声明关键字 ES6新增的声明关键字&#xff1a; let&#xff0c;const&#xff1a;声明变量class&#xff1a;声明类import&#xff0c…...

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 这里已经执行成功了&#xff0c;注意这里需要加入/upload.php 5.写入一句话木马 &…...

MSB20M-ASEMI迷你贴片整流桥MSB20M

编辑&#xff1a;ll MSB20M-ASEMI迷你贴片整流桥MSB20M 型号&#xff1a;MSB20M 品牌&#xff1a;ASEMI 封装&#xff1a;UMSB-4 特性&#xff1a;贴片、整流桥 最大平均正向电流&#xff1a;2A 最大重复峰值反向电压&#xff1a;1000V 恢复时间&#xff1a;&#xff1…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

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&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...