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

news2024/12/23 1:24:07

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.coloradmin.cn/o/1368971.html

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

相关文章

ATA-P系列功率放大器在压电叠堆中的作用是什么

功率放大器在压电叠堆中的作用是为压电叠堆提供足够的电能&#xff0c;使其产生强大的机械振动。以下为您详细介绍一下。 压电叠堆是一种利用压电效应产生振动的器件。通过在叠堆上施加电压&#xff0c;叠堆内部的压电材料会产生机械应变&#xff0c;从而引起叠堆的振动。这种振…

C++的一些书籍整理(个人学习)

UNIX环境高级编程&#xff08;第三版&#xff09; UNXI网络编程卷1 网络编程的笔记 收藏 我会了 一堆书 这个仓 数据库连接池原理介绍常用连接池介绍

7.3 CONSTANT MEMORY AND CACHING

掩模数组M在卷积中的使用方式有三个有趣的属性。首先&#xff0c;M阵列的大小通常很小。大多数卷积掩模在每个维度上都少于10个元素。即使在3D卷积的情况下&#xff0c;掩码通常也只包含少于1000个元素。其次&#xff0c;在内核执行过程中&#xff0c;M的内容不会改变。第三&am…

移动端对大批量图片加载的优化方法(三)

移动端对大批量图片加载的优化方法&#xff08;三&#xff09;Flutter 本篇主要从Flutter开发中可以使用到的对大批量图片加载的优化方法进行整理。 1.合适的图片格式 详情请参考移动端对大批量图片加载的优化方法&#xff08;一&#xff09;。 2.缓存机制 在Flutter中&am…

2023年山东省职业院校技能大赛高职组信息安全管理与评估—内存取证解析

内存取证 1、从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password} 形式提交(密码为 6 位); volatility -f 1.vmem imageinfo 操作系统我们一般取第一个就可以了

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.写入一句话木马 &…

Qt实现简单的分割窗口

最近在学习一些关于Qt的新知识&#xff0c;今天来讲述下我学习到的窗口分割&#xff0c;如果有不正确的&#xff0c;大家可以指正哦~ 首先&#xff0c;先看一下实现之后的简单效果吧&#xff01;省的说的天花乱坠&#xff0c;大家却不知道说的是哪个部分。 功能实现 整体demo…

阿里云RDMA通信库XRDMA论文详解

RDMA(remote direct memory access)即远端直接内存访问&#xff0c;是一种高性能网络通信技术&#xff0c;具有高带宽、低延迟、无CPU消耗等优点。RDMA相比TCP在性能方面有明显的优势&#xff0c;但在编程复杂度上RDMA verbs却比TCP socket复杂一个数量级。 开源社区和各大云厂…

如何在iOS手机上查看应用日志

引言 在开发iOS应用过程中&#xff0c;查看应用日志是非常重要的一项工作。通过查看日志&#xff0c;我们可以了解应用程序运行时的状态和错误信息&#xff0c;帮助我们进行调试和排查问题。本文将介绍两种方法来查看iOS手机上的应用日志&#xff0c;并提供相应的操作步骤。 …

Python学习之路——文件部分【书接上回】

一、书接上回 上个博客我说过&#xff0c;为什么最开始的时候一定要将文件内的中文的逗号替换为英文的逗号&#xff0c;接下来&#xff0c;请看&#xff08;其实想一想&#xff0c;感觉没必要&#xff0c;不过也是好的&#xff0c;总要练练手的嘛&#xff09; def func03(st…

Spring——基于注解的AOP配置

基于注解的AOP配置 1.创建工程 1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

基于DNA的密码学和隐写术综述

摘要 本文全面调研了不同的脱氧核糖核酸(DNA)-基于密码学和隐写术技术。基于DNA的密码学是一个新兴领域,利用DNA分子的大规模并行性和巨大的存储容量来编码和解码信息。近年来,由于其相对传统密码学方法的潜在优势,如高存储容量、低错误率和对环境因素的抗性,该领域引起…

怎么把图片表格转成word表格?教你简单转换

怎么把图片表格转成word表格&#xff1f;在我们的日常工作中&#xff0c;经常会遇到需要将图片表格转换成Word表格的情况。这样不仅可以方便我们编辑、整理数据&#xff0c;还能提高工作效率。那么&#xff0c;如何将图片表格快速、准确地转换成Word表格呢&#xff1f;下面就为…

openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败

文章目录 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败190.1 服务启动失败190.1.1 问题现象190.1.2 原因分析190.1.3 处理办法 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败 190.1 服务启动失败 190.1.1 问题现…

国芯科技荣膺高工智能汽车“年度车规MCU高成长供应商”,加速产品精准化系列化布局

2023年12月13—15日&#xff0c;2023&#xff08;第七届&#xff09;高工智能汽车年会在上海召开&#xff0c;大会以“寻找拐点”为主题&#xff0c;通过超80场主题演讲及多场圆桌对话&#xff0c;为智能汽车赛道参与者「备战2024」提供全方位的决策支持。 作为汽车电子芯片领…

DNS解析原理和k8s DNS 实践

1. 问题背景 1.1 域名解析异常 近期开发的一个功能&#xff0c;需要在k8s集群容器环境中调用公司内部api&#xff0c;api提供了内网域名&#xff0c;解析内网域名异常导致请求超时&#xff0c;因此梳理了下DNS的知识点。 可以先看到下面&#x1f447;这段配置&#xff0c;修…

基于net6的asp.net core webapi项目打包为docker镜像,并推送至私有镜像仓库harbor中

基于net6的asp.net core webapi项目打包为docker镜像&#xff0c;并推送至私有镜像仓库harbor中 0、环境说明1、打包步骤1.1 创建Asp.net core WebApi项目1.2 在Asp.net core WebApi项目根目录下创建Dockerfile文件1.3 在子系统Ubuntu20.04.4中通过docker build生成docker镜像1…

资源分享:GIS插件-海怪工具箱(附下载链接)

工具详情&#xff1a; ArcGIS海怪工具箱&#xff0c;可直接在ArcGIS中安装使用。 功能&#xff1a; 1、按属性编码&#xff1a;根据字段编码&#xff0c;相同的字段值同一个编码&#xff0c;然后依次升序。 可以手动指定编码样式&#xff0c;比如输入1&#xff0c;那么后续编…

three.js实现旋转棱锥效果

three.js实现旋转棱锥效果 图例 步骤 创建一个四面棱锥添加贴图render函数中旋转&#xff0c;修改高度 代码 <template><div class"app"><div ref"canvesRef" class"canvas-wrap"></div></div> </template…

Python——欢迎来到吱昂张游乐园

欢迎来到吱昂张游乐园&#xff01;&#xff01;&#xff01; 凡是身高小于120或者您的vip等级大于三级的皆可免费游玩。 那我们接下来就来设计一下以上的规则叭 print("欢迎来到吱昂张游乐园") if int(input("输入您的身高&#xff1a;"))>120:print…