编程模拟 NAT 网络地址转换(2024)

1.题目描述

参考计算机网络教材 188 页内容,模拟 NAT 路由器的工作过程,主要有 2 个步骤的工作:1、将收到的来自 内网报文中的私有源 IP 地址转换为 NAT 的外部合法 IP 地址,同时将传输层源端口号转换为 NAT 路 由器分配的端口号,建立转换映射表;2、将收到的来自外网的应答报文提取其目的 IP 地址及端口号, 查找映射表,找到其对应的内网机器的 IP 地址及端口号并替换。 转换表如下图所示:

614c2622070b4877a7f08520acd13313.png

因此我们只需要实现转换功能就可以,可以用if else来实现(doge)。

这里我们可以用两个Map表来维护,保证查询速度


2.运行Demo

5e7dc287d0b54e48a0615b7275d8fa85.png

图2.1主页面

cac7e9c7a7a14f5492b4498ddabc2d27.png

图2.2 转换结果

其他功能自行探索 ,doge


3.程序代码

//time:2024.1.4
//coder:MGJ
#include <iostream>
#include<map>
#include <conio.h>
#include <windows.h>

using namespace std;
//功能数量
#define MENUNUMS1 4
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//函数声明
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();

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
map<string, string> Maps_In;
map<string, string> Maps_Out;

//----------------------------------------------------------------------------------
//主函数
int main() {
    int out = 0;
    Init_data();
    while (true) {
        out = Menuchoose1();
        Function_Select(out);
    }
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//初始化函数
void Init_data() {
    Maps_In["172.38.1.5:40001"] = "192.168.0.3:30000";
    Maps_In["172.38.1.5:40002"] = "192.168.0.4:30000";
    Maps_Out["192.168.0.3:30000"] = "172.38.1.5:40001";
    Maps_Out["192.168.0.4:30000"] = "172.38.1.5:40002";
}

//选择函数
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 *=====模拟 NAT 网络地址转换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) {
    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("cls");
}

void Net_address_translation() {
    string Search_addrs;
    cout << "请输入IP与端口(例如:172.38.1.5:40001):" << endl;
    cin >> Search_addrs;
    cout << endl << " 转换结果为:--------------------------------" << endl << endl;
    if (Maps_In.find(Search_addrs) == Maps_In.end() && Maps_Out.find(Search_addrs) == Maps_Out.end()) {
        cout << " * 系统没有此地址IP *" << endl;
    } else if (Maps_In.find(Search_addrs) != Maps_In.end()) {
        cout << "  内部地址: " << Maps_In[Search_addrs] << endl;
    } else if (Maps_Out.find(Search_addrs) != Maps_Out.end()) {
        cout << "  外部地址:" << Maps_Out[Search_addrs] << endl;
    }
    cout << endl << " -------------------------------------------" << endl;
    system("pause");

}

void Net_address_add() {
    string Input_interior_addrs;
    string Input_exterior_addrs;
    cout << "请输入内部地址(例如:172.38.1.5:40001):" << endl;
    cin >> Input_interior_addrs;
    cout << "请输入外部地址(例如:172.38.1.5:40001):" << endl;
    cin >> Input_exterior_addrs;
    cout << endl << " 保存结果为:--------------------------------" << endl << endl;
    cout << "  内部地址:" << Input_interior_addrs << endl;
    cout << "  外部地址:" << Input_exterior_addrs << endl;
    cout << endl << " -------------------------------------------" << endl;
    Maps_In[Input_exterior_addrs] = Input_interior_addrs;
    Maps_Out[Input_interior_addrs] = Input_exterior_addrs;
    system("pause");
}

void Net_address_delect() {
    string Search_addrs;
    cout << "请输入需要删除的IP与端口(例如:172.38.1.5:40001):" << endl;
    cin >> Search_addrs;
    cout << endl << " 删除结果为:--------------------------------" << endl << endl;
    if (Maps_In.find(Search_addrs) == Maps_In.end() && Maps_Out.find(Search_addrs) == Maps_Out.end()) {
        cout << " * 系统没有此地址IP *" << endl;
    } else if (Maps_In.find(Search_addrs) != Maps_In.end()) {
        cout << "  内部地址: " << Maps_In[Search_addrs] << endl;
        cout << "  外部地址: " << Search_addrs<< endl;
        Maps_Out.erase(Maps_In[Search_addrs]);
        Maps_In.erase(Search_addrs);
    } else if (Maps_Out.find(Search_addrs) != Maps_Out.end()) {
        cout << "  内部地址: " << Search_addrs<< endl;
        cout << "  外部地址: " << Maps_Out[Search_addrs] << endl;
        Maps_In.erase(Maps_Out[Search_addrs]);
        Maps_Out.erase(Search_addrs);
    }
    cout << endl << " -------------------------------------------" << endl;
    system("pause");
}

void Net_address_revise() {
    string Search_addrs;
    string Input__addrs;
    cout << "请输入需要修改的IP与端口(例如:172.38.1.5:40001):" << endl;
    cin >> Search_addrs;
    cout << endl << " 当前结果为:--------------------------------" << endl << endl;
    if (Maps_In.find(Search_addrs) == Maps_In.end() && Maps_Out.find(Search_addrs) == Maps_Out.end()) {
        cout << " * 系统没有此地址IP *" << endl;
        cout << endl << " -------------------------------------------" << endl;
        system("pause");
        return;
    } else if (Maps_In.find(Search_addrs) != Maps_In.end()) {
        cout << "  内部地址: " << Maps_In[Search_addrs] << endl;
        cout << "  外部地址: " << Search_addrs<< endl;
        cout << endl << " -------------------------------------------" << endl;
        cout << "请修改内部的IP与端口(例如:172.38.1.5:40001):" << endl,cin>>Input__addrs;;
        Maps_In[Search_addrs]=Input__addrs;
    } else if (Maps_Out.find(Search_addrs) != Maps_Out.end()) {
        cout << "  内部地址: " << Search_addrs<< endl;
        cout << "  外部地址: " << Maps_Out[Search_addrs] << endl;
        cout << endl << " -------------------------------------------" << endl;
        cout << "请修改外部的IP与端口(例如:172.38.1.5:40001):" << endl,cin>>Input__addrs;;
        Maps_Out[Search_addrs]=Input__addrs;
    }
    cout << endl << " -------------------------------------------" << endl;
    system("pause");
}
//清屏函数
void cls() {
    COORD pos;
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    pos.Y = pos.X = 0;
    SetConsoleCursorPosition(hOut, pos);
}

点个关注,哈哈 

 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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java数据结构与算法刷题-----LeetCode64. 最小路径和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

ECharts 图表简单示例,中国地图

目录 ECharts官网链接: [ECharts](https://echarts.apache.org/zh/index.html)在项目中引入 Apache ECharts柱状图折线图饼图仪表盘中国地图完整示例代码 ECharts官网链接: ECharts 在项目中引入 Apache ECharts <!DOCTYPE html> <html><head><meta char…

Python编程+copilot+代码补全+提高效率

Python编程copilot代码补全提高效率 copilot是由Github和OpenAI合作开发的一款AI编程工具&#xff0c;它可以根据自然语言或部分代码&#xff0c;自动给出合适的代码补全建议。copilot支持多种编程语言&#xff0c;包括Python&#xff0c;也可以在Pycharm等主流IDE中使用。本资…

stm32cube keil5第二次下载程序不成功

1.第一次下载成功&#xff0c;第二次需要按重置键下载然后松开能下载成功。是因为之前stm32cube默认设置了nodebug模式。修改读写模式第二次就可以下载。 2.keil5每次不用按钮重置按钮刷新程序 keil5设置。

2024第九届上海国际智慧工地展览会-官 网

2024第九届上海国际智慧工地展览会 时间&#xff1a;2024年10月30-11月1日 地点&#xff1a;上海世博展览馆 主办单位&#xff1a;联合国人居署 上海市住房和城乡建设管理委员会 协办单位&#xff1a;上海世界城市日事务协调中心 智慧工地是一种应用信息化、智能化技术的施…

6类典型场景的无线AP选型和部署方案

你们好&#xff0c;我的网工朋友。 前段时间刚给你们来了篇解决无线频繁断网的技术文&#xff0c;《解决无线频繁断网&#xff0c;这个办法值得收藏&#xff01;》。 不少朋友私聊&#xff0c;说想再聊聊无线AP的选型和部署方案&#xff0c;这不就安排上了&#xff1f; 无线…

构建免费的Dokan和WooCommerce构建线上课程市场在线销售数字课程

我们知道创建良好的学习说明和材料很困难。但当涉及到销售时&#xff0c;就变得更加困难。如果您无法出售您的课程&#xff0c;那么没有什么比这更令人沮丧的了。 幸运的是&#xff0c;如果您使用的是 WordPress 网站&#xff0c;那么您可以非常轻松且免费地完成此操作。借助L…

苹果IOS如何支持微信小程序分享

各位同学们好&#xff01;我是咕噜铁蛋&#xff01;&#xff0c;我们经常需要与读者分享有关移动应用的使用方法和技巧。微信小程序是一种便捷的应用形式&#xff0c;可以在微信内部直接使用&#xff0c;而无需下载和安装。本文铁蛋讲详细介绍iOS苹果支持微信小程序类型分享的使…

张驰咨询:精益生产咨询如何塑造行业未来?

驻厂精益生产咨询是一种咨询服务&#xff0c;顾问直接在客户的生产现场进行长期驻点&#xff0c;通过现场观察、分析和指导&#xff0c;帮助企业实施精益生产的方法和工具&#xff0c;旨在改善生产效率&#xff0c;减少浪费&#xff0c;提升产品质量&#xff0c;并降低成本。这…

ICC2/innovus:hcell文件产生方法

更多学习内容请关注「拾陆楼」知识星球 拾陆楼知识星球入口 相关文章链接: Calibre:LVS Calibre:LVS常见问题解析

美易官方:美股2024年开局惨淡,调整会持续多久?

美股2024年开局惨淡&#xff0c;调整会持续多久&#xff1f;美易官方平台致力于为投资者与美股深度链接 2024年&#xff0c;美股市场迎来了一个艰难的开局。全球经济形势的不确定性、地缘政治紧张局势以及市场预期的波动都给美股市场带来了挑战。投资者们对于未来的走势充满了疑…

电话号码信息收集工具:PhoneInfoga | 开源日报 No.137

sundowndev/phoneinfoga Stars: 11.2k License: GPL-3.0 PhoneInfoga 是一个用于扫描国际电话号码的信息收集框架&#xff0c;它允许用户首先收集基本信息 (如国家、地区、运营商和线路类型)&#xff0c;然后使用各种技术来尝试找到 VoIP 提供商或识别所有者。该工具与一系列必…

Google Earth Engine(GEE)深度学习入门教程- 环境搭建篇

本人的研究方向是基于深度学习方法的作物遥感识别。经查阅目前的相关教程资料后&#xff0c;发现深度学习的GEE教程几乎没有&#xff0c;所以开始动笔写下此片文章&#xff0c;给后面研究这个方向的人提供一点帮助吧。 教程的背景 为什么要写这份教程&#xff1f; 一、深度学…

Hadoop集群环境下HDFS实践编程过滤出所有后缀名不为“.abc”的文件时运行报错:java.net.ConnectException: 拒绝连接;

一、问题描述 搭建完Hadoop集群后&#xff0c;在Hadoop集群环境下运行HDFS实践编程使用Eclipse开发调试HDFS Java程序&#xff08;文末有源码&#xff09;&#xff1a; 假设在目录“hdfs://localhost:9000/user/hadoop”下面有几个文件&#xff0c;分别是file1.txt、file2.tx…

PySimpleGUI主题窗口样式

说明 PySimpleGUI是一个基于Tthinter的简单GUI框架&#xff0c;可以作为python下跨平台的轻量级UI来使用。我看到示例代码里有设置主题的代码&#xff0c;所以找官方文档看了下&#xff0c;可以预览素有主题&#xff0c;方法是&#xff1a; import PySimpleGUI as sg sg.them…

微信公众号-订阅通知

第一步&#xff1a; 公众号需要实名认证&#xff0c;完成以后&#xff01; 设置-开发里找到基本配置&#xff1a; 开发者ID(AppID):xxxxxxxxxxxxxxxxxxxxxxxxx 开发者密码(AppSecret):xxxxxxxxxxxxxxxxxxxxxxxxx 白名单IP也要填写上你的服务器IP哦&#xff01; 第二步&am…

Hadoop-HA高可用

一、集群规划 二、HDFS高可用 官方地址 在opt目录下创建一个ha文件夹&#xff0c;将/opt/module/下的 hadoop-3.1.3拷贝到/opt/ha目录下&#xff08;记得删除data 和 log目录&#xff09; 配置core-site.xml hdfs-site.xml <configuration><!-- NameNode数据存…

【无标题】山姆奥特曼喊话AI创业者

这里写自定山姆奥特曼充满激情地向创业者们发出呼吁&#xff0c;他表示AI是一个可以媲美互联网早期机遇的巨大机会。与此相关的人士认为&#xff0c;现在是互联网和移动互联网创业者们行动起来的时候了&#xff01;他们应该全面拥抱大模型的应用层创业。第一波红利期在6-8个月内…

电子实验室设备:从零开始配置实验室(一)

本文译自 Electronics Lab Equipment: Kitting out a Lab from Scratch 随着多次国际迁徙以及在几家公司&#xff08;或其分支机构&#xff09;工作&#xff0c;尤其是在没有强大电子工程团队的情况下&#xff0c;我不得不为自己和客户设置多个电子实验室。那些计划进行内部测试…

Vue3+TS+Vite 构建自动导入开发环境

关注⬆️⬆️⬆️⬆️ 专栏后期更新更多前端内容 在一个使用 Vue 3、Vite 和 TypeScript 的项目中,配置 unplugin-auto-import 和 unplugin-vue-components 插件可以极大地提高开发效率,因为它们可以自动导入 Vue 相关的 API 和 Vue 组件,从而减少了手动导入的需要。 文章目…