简单模拟网桥对mac地址的转发,开始转发表为空,动态生成转发表

模拟网段示意图

算法实现

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include <vector>
using namespace std;//网桥登记信息
struct Data{string macAddr;//收到帧的源mac地址  用一个英文字母模拟(和书上一样) 但也可以任意字符串int port;//收到帧进入该网桥的接口号string time;//收到帧进入网桥的时间Data(){macAddr="",port=0,time="";}//初始化
};//转发表  模拟3个网段 两个转发表  此处接口号还模拟网段号
vector<Data> Table[2];//转发表 0 两张转发表    接口1 转发表0 接口2  接口3 转发表1 接口4//接口与网桥(转发表的映射) 1->0 2->0 3->1 4->1
int portBrige[]={0,0,0,1,1};//剩下的转发端口 1->3 2->0 3->5 4->2  一个网桥有几个端口这应该是写死的 此处模拟的网桥仅2个端口
int RemainingPort[]={-1,3,0,5,2};//获取当前时间
string getNowTime(){time_t timep;//时间结构体变量struct tm *p;char *wday[]={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};time(&timep);//获取当前时间p=localtime(&timep);//获取当地时间 并按现在的时间日期来表示char a[100];sprintf(a,"%d年%d月%d日 %s %02d:%02d:%02d",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday,wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);string ans=a;return ans;
}//转发表table里找目标地址macAdde  源站地址也要接收  因为每次写表的就是源站地址信息
int Find(vector<Data> &table,Data Start,Data End){//转发表用引用 否则转发记录无法保存//写或者更新源站地址信息  每次都要执行 写到哪都一样int i;for(i=0;i<table.size();i++){if(table[i].macAddr==Start.macAddr){table[i].time=getNowTime();//找到了 更新时间break;}}if(i==table.size()){//没找到源站 写入Start.time=getNowTime();table.push_back(Start);//加入一条记录 源站信息}//查找目的站for(i=0;i<table.size();i++){if(table[i].macAddr==End.macAddr){table[i].time=getNowTime();//更新时间return table[i].port;//返回找到的端口}}//没找到  返回-1return -1;
}//打印转发表
void Print(vector<Data> table){printf("地址\t接口\t更新时间\n");for(int i=0;i<table.size();i++){cout<<table[i].macAddr<<"\t"<<table[i].port<<"\t"<<table[i].time<<endl;}cout<<endl;
}void startSend(Data s,Data e){int n=portBrige[s.port];int x=Find(Table[n],s,e);if(x==-1){cout<<"网桥"<<n<<"未找到"<<e.macAddr<<".已转发给除"<<s.port<<"以外所有接口\n";//转到其他端口s.port=RemainingPort[s.port];if(s.port>=1&&s.port<=4){//在模拟的两个网桥范围内startSend(s,e);return;}else{cout<<"在模拟范围以外继续查找!"<<endl;}}else{//找到了 一直查表查下去即可 直接打印转发表if(x==s.port){//端口号相同 cout<<"找到了但是端口号相同,也即"<<s.macAddr<<"与"<<e.macAddr<<"在同一个网段,不需要经过网桥转发,直接丢弃!"<<endl;}else{cout<<"找到了,已从端口"<<x<<"转发此帧"<<endl;}}
}int main(){cout<<"透明网桥模拟\n";Data Start,End;cout<<"输入源地址:";cin>>Start.macAddr;cout<<"输入接口号:";cin>>Start.port;//1 2 3 4 cout<<"输入目的地址:";cin>>End.macAddr;while(1){startSend(Start,End);cout<<"转发表0"<<endl;Print(Table[0]);cout<<"转发表1"<<endl;Print(Table[1]);cout<<"输入源地址:";cin>>Start.macAddr;cout<<"输入接口号:";cin>>Start.port;//1 2 3 4 cout<<"输入目的地址:";cin>>End.macAddr;}return 0;
}

运行结果:

透明网桥模拟
输入源地址:A
输入接口号:1
输入目的地址:F
网桥0未找到F.已转发给除1以外所有接口
网桥1未找到F.已转发给除3以外所有接口
在模拟范围以外继续查找!
转发表0
地址    接口    更新时间
A       1       2019年4月10日 星期三 20:12:35转发表1
地址    接口    更新时间
A       3       2019年4月10日 星期三 20:12:35输入源地址:B
输入接口号:1
输入目的地址:F
网桥0未找到F.已转发给除1以外所有接口
网桥1未找到F.已转发给除3以外所有接口
在模拟范围以外继续查找!
转发表0
地址    接口    更新时间
A       1       2019年4月10日 星期三 20:12:35
B       1       2019年4月10日 星期三 20:12:40转发表1
地址    接口    更新时间
A       3       2019年4月10日 星期三 20:12:35
B       3       2019年4月10日 星期三 20:12:40输入源地址:C
输入接口号:3
输入目的地址:Z
网桥1未找到Z.已转发给除3以外所有接口
在模拟范围以外继续查找!
转发表0
地址    接口    更新时间
A       1       2019年4月10日 星期三 20:12:35
B       1       2019年4月10日 星期三 20:12:40转发表1
地址    接口    更新时间
A       3       2019年4月10日 星期三 20:12:35
B       3       2019年4月10日 星期三 20:12:40
C       3       2019年4月10日 星期三 20:12:57输入源地址:F
输入接口号:4
输入目的地址:A
找到了,已从端口3转发此帧
转发表0
地址    接口    更新时间
A       1       2019年4月10日 星期三 20:12:35
B       1       2019年4月10日 星期三 20:12:40转发表1
地址    接口    更新时间
A       3       2019年4月10日 星期三 20:13:05
B       3       2019年4月10日 星期三 20:12:40
C       3       2019年4月10日 星期三 20:12:57
F       4       2019年4月10日 星期三 20:13:05输入源地址:A
输入接口号:1
输入目的地址:F
网桥0未找到F.已转发给除1以外所有接口
找到了,已从端口4转发此帧
转发表0
地址    接口    更新时间
A       1       2019年4月10日 星期三 20:13:09
B       1       2019年4月10日 星期三 20:12:40转发表1
地址    接口    更新时间
A       3       2019年4月10日 星期三 20:13:09
B       3       2019年4月10日 星期三 20:12:40
C       3       2019年4月10日 星期三 20:12:57
F       4       2019年4月10日 星期三 20:13:09输入源地址:A
输入接口号:1
输入目的地址:B
找到了但是端口号相同,也即A与B在同一个网段,不需要经过网桥转发,直接丢弃!
转发表0
地址    接口    更新时间
A       1       2019年4月10日 星期三 20:13:38
B       1       2019年4月10日 星期三 20:13:38转发表1
地址    接口    更新时间
A       3       2019年4月10日 星期三 20:13:09
B       3       2019年4月10日 星期三 20:12:40
C       3       2019年4月10日 星期三 20:12:57
F       4       2019年4月10日 星期三 20:13:09输入源地址:

透明网桥算法c++实现相关推荐

  1. Python3 透明网桥算法

    import time#定义网桥1 b1 = {}port_list1 = [1, 2]#主机列表 L1 = ['a','b','c']L2 = ['d','e']L = [L1,L2]def get ...

  2. 计算机网络透明网桥的算法,网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟.doc...

    网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟 计算机网络基础 课 程 设 计 报 告 学号: 姓名: 班级: 题号:01.06.07 题目:曼切斯特编码模拟.透明网桥自学习域转 ...

  3. 配置透明网桥实现QinQ传输案例

    拓扑图 规格 对于V200R008C20及更低版本,只有AR100&AR120&AR150&AR160&AR200系列支持该示例. 对于V200R008C30及更高版本 ...

  4. 去掉图片黑背景输出为透明png(算法和工具)

    去掉图片黑背景输出为透明png(算法和工具) 有时候你得到的图片不是透明的png而是加了黑背景的图(可能是:.jpg,.gif,.png等格式的图) 例如一个粒子效果的图: 多好的粒子效果,可惜它有黑 ...

  5. iptables透明网桥无法使用透明代理错误

    环境:squid,第三方过滤产品 要求:配置网桥,过滤用户的访问需求 问题:用户通过代理能被过滤,但是清除代理设置时,无法过滤. 分析:问题应该是出在iptables上,套用之前的脚本时没把我指定的端 ...

  6. C和C++算法完整教程专栏完整目录

    C和C++算法完整教程专栏完整目录 专栏说明如下 完整专栏目录如下 专栏说明如下 内容:C和C++算法完整教程 数量:680篇博文(2023年2月15日截止) 更新时间至:2023年2月15日(后续加 ...

  7. 计算机网络知识点——4.介质访问控制子层

    概述: 多路访问链路(广播链路)采用共享介质连接所有站点.发送站点通过广播方式发送数据并占用整个共享介质的带宽.由于每个站点只需要一条网线接入网络就可以访问所有站点,这种网络一般安装简单,价格便宜.局 ...

  8. 计算机网络第三章——数据链路层(仅记录我所认为重要的知识点)

    计算机网络第三章--数据链路层 数据链路层使用的信道类型 点对点信道 广播信道 数据链路层位置 数据链路层的3个基本问题 数据链路和帧 链路 数据链路 数据链路层传输的是帧 封装成帧 透明传输问题 差 ...

  9. C和C++实战教程专栏完整目录

    C和C++实战教程专栏完整目录 专栏说明如下 专栏目录 专栏说明如下 内容:C和C++实战教程 数量:273篇博文(2023年2月15日截止) 更新时间至:2023年2月15日(后续加上去的博文,会每 ...

  10. 二层交换:网桥(交换机)

    二层交换 有很多LAN,如何将它们连接起来? 可用网桥(bridges)将它们连接起来,如下,中间的就是网桥 网桥工作在DLL层,通过检查MAC地址做出转发帧的决策 网桥可以将不同类型的两个LAN连接 ...

最新文章

  1. CoFun 1612 单词分组(容斥)
  2. Bresenham 算法画线 画圆
  3. Magicodes.IE已支持导出Word、Pdf和Html
  4. 教程:正确的SLF4J日志记录用法以及如何检查它
  5. 数据新动能:帆软第四届智数大会圆满落幕
  6. 2016012072+张济吨+散列函数的应用及其安全性
  7. Linux Suspend过程【转】
  8. POJ1338 Ugly Numbers(解法二)【废除!!!】
  9. 全国多年平均相对湿度空间分布数据
  10. android 数组赋值字符串_给字符数组赋值的方法
  11. cad图形如何导入到奥维地图_如何将CAD图导入奥维地图
  12. 【非长篇大论】X3D - Web3D标准的发展
  13. 【408预推免复习】计算机网络(谢希仁第七版)第三章——数据链路层
  14. labelme安装及标签制作
  15. android一键刷机工具,刷机也能如此轻松 Android一键刷机工具
  16. 装上后这 10个扩展后,VSCode 猛虎添翼,无敌了
  17. 电脑注册表编辑器在哪打开
  18. @EnableConfigurationProperties 注解
  19. android微信源生SDK分享问题
  20. 京东商城的商品分类代码

热门文章

  1. java生成短连接(调用新浪微博api生成)
  2. ie浏览器多开-----同时登陆多个账号
  3. c语言学习笔记(7)单引号,双引号和逻辑符号的用法
  4. python两个日期计算年龄
  5. 求两个数的最小公倍数及多个数的最小公倍数的求法
  6. 吉林省等保测评机构项目测评收费价格标准参考
  7. 公网IP和内网IP如何分辨?
  8. 知识直播的“顶流”,正在被复制
  9. C++学习之路——名字空间与模板
  10. 编译原理复习总结及思维导图