计算机网络 - 路由器查表过程模拟 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博客

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用SpirngBoot时部分编译报错解决方案:

1. 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。 报错截图&#xff1a; 解决方案&#xff1a; 找到springboot的java版本看是多少版本&#xff0c;springboot 3.0以上的版本需要最低JDK17的版本&#xff0c;所以查看你自己…

LeetCode 2397. 被列覆盖的最多行数:二进制枚举

【LetMeFly】2397.被列覆盖的最多行数&#xff1a;二进制枚举 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-rows-covered-by-columns/ 给你一个下标从 0 开始的 m x n 二进制矩阵 mat 和一个整数 cols &#xff0c;表示你需要选出的列数。 如果一行中&am…

Transformer从菜鸟到新手(五)

引言 上篇文章我们在单卡上完成了完整的训练过程。 从本文开始介绍模型训练/推理上的一些优化技巧&#xff0c;本文主要介绍多卡并行训练。 下篇文章将介绍大模型推理常用的缓存技术。 多卡训练 第一个要介绍的是利用多GPU优化&#xff0c;因为在单卡上训练实在是太慢。这…

ip协议历史

今天的互联网&#xff0c;是万维网&#xff08;WWW&#xff09;一家独大。而在上世纪七八十年代&#xff0c;人们刚开始尝试网络连接时&#xff0c;那时出现了计算机科学研究网络、ALOHA 网、因时网、阿帕网等不同类型的网络&#xff0c;这些网络之间互相通信是个难题。 于是&…

IDEA 常用快捷键大全(建议收藏)

代码开发时 常用快捷键 快捷键功能使用建议CtrlAltOOptimize imports 比较实用 去除导入的无用的包CtrlAltIAuto-indent line(s) 比较实用 自动缩进代码CtrlAltLReformat code 比较实用 格式化选中的代码CtrlAltShiftL 比较实用 格式化整个文件TabIndent 比较实用 缩进Sh…

MySQL之导入、导出

文章目录 1.navicat导入导出2.mysqldump命令导入导出2.1导出2.2导入 3.load data infile命令导入导出4.远程备份5.思维导图 1.navicat导入导出 使用Navicat工具导入t_log 共耗时 55s 2.mysqldump命令导入导出 2.1导出 导出表数据和表结构 语法&#xff1a; mysqldump -u用…

Pytest接口自动化测试框架搭建

一. 背景 Pytest目前已经成为Python系自动化测试必学必备的一个框架&#xff0c;网上也有很多的文章讲述相关的知识。最近自己也抽时间梳理了一份pytest接口自动化测试框架&#xff0c;因此准备写文章记录一下&#xff0c;做到尽量简单通俗易懂&#xff0c;当然前提是基本的py…

vue中鼠标拖动触发滚动条的移动

前言 在做后端管理系统中&#xff0c;像弹窗或大的表单时&#xff0c;经常会有滚动条的出现&#xff0c;但有些时候如流程、图片等操作时&#xff0c;仅仅使用鼠标拖动滚动条操作不太方便&#xff0c;如果使用鼠标拖拽图片或容器来触发滚动条的移动就比较方便了 功能设计 如…

519基于单片机的自动切割流程控制系统

基于单片机的自动切割流程控制系统[proteus仿真] 自动切割流程控制系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于单片机的自动切割流程控制系统 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&…

java智慧医院互联网智慧3D导诊系统源码,经由智慧导诊系统多维度计算,准确推荐科室

什么是智慧导诊系统? 简单地说&#xff0c;智慧导诊系统是一种利用人工智能技术&#xff0c;为医生提供帮助的系统。它可以通过分析患者的症状和病史为医生提供疾病诊断和治疗方案的建议。 系统介绍&#xff1a; 医院智慧导诊系统是在医院中使用的引导患者自助就诊挂号&…

拼多多API:从数据中挖掘商业价值的力量

随着大数据时代的来临&#xff0c;数据已经成为企业决策和创新的基石。拼多多API作为电商领域的重要接口&#xff0c;为企业提供了从数据中挖掘商业价值的机会。通过拼多多API&#xff0c;企业可以获取丰富的用户数据、商品数据和交易数据&#xff0c;从而深入了解市场需求、优…

springboot学生成绩管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

性能分析与调优: Linux 性能分析60秒

目录 一、实验 1.环境 2.Linux性能分析60秒 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192.168…

doris部署

doris-2.0.1.1部署安装 一、下载doris安装包二、解压到/data下&#xff0c;修改名称三、修改fe配置文件四、启动doris-fe五、验证doris-fe六、修改be配置文件七、启动doris-be八、mysql中连接be&#xff0c;在Doris中添加后端节点九、设置密码 一、下载doris安装包 wget https…

【野火i.MX6ULL开发板】在MobaXterm平台利用Type-C线串口连接开发板

0、前言 参考文献&#xff1a; http://t.csdnimg.cn/9iRTm http://t.csdnimg.cn/Z0n60 问题&#xff1a;一直识别不出com口&#xff0c; 拟解决思路&#xff1a; 百度网盘重新下载Debian镜像&#xff0c;烧入full版镜像&#xff0c;随便换一下USB插口&#xff08;电脑主机上…

【AI视野·今日Robot 机器人论文速览 第六十八期】Tue, 2 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Tue, 2 Jan 2024 Totally 12 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Edge Computing based Human-Robot Cognitive Fusion: A Medical Case Study in the Autism Spectrum Disorder Therapy Author…

【小白专用】C#关于角色权限系统

&#xff08;C#&#xff09;用户、角色、权限 https://www.cnblogs.com/huangwen/articles/638050.html 权限管理系统——数据库的设计&#xff08;一&#xff09; https://www.cnblogs.com/cmsdn/p/3371576.html 权限管理系统——菜单模块的实现&#xff08;二&#xff09; …

CodeGPT,你的智能编码助手—CSDN出品

CodeGPT是由CSDN打造的一款生成式AI产品&#xff0c;专为开发者量身定制。 无论是在学习新技术还是在实际工作中遇到的各类计算机和开发难题&#xff0c;CodeGPT都能提供强大的支持。其涵盖的功能包括代码优化、续写、解释、提问等&#xff0c;还能生成精准的注释和创作相关内…

提升网络安全重要要素IP地址

在数字化时代&#xff0c;网络安全已经成为人们关注的焦点。本文将深入探讨网络安全与IP地址之间的紧密联系&#xff0c;以及IP地址在构建数字世界的前沿堡垒中的关键作用。 网络安全是当今数字社会中不可忽视的挑战之一。而IP地址&#xff0c;作为互联网通信的基础协议&#…

Unity 欧盟UMP用户隐私协议Android接入指南

Unity 欧盟UMP用户协议Android接入指南 官方文档链接开始接入mainTemplate.gradle 中引入CustomUnityPlayerActivity 导入UMP相关的包java类中新增字段初始化UMPSDK方法调用![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d882171b068c46a1b956e80425f3a9cf.png)测…