收藏 分销(赏)

透明网桥的自学习和转发帧算法.doc

上传人:pc****0 文档编号:6113859 上传时间:2024-11-28 格式:DOC 页数:6 大小:111.08KB 下载积分:10 金币
下载 相关 举报
透明网桥的自学习和转发帧算法.doc_第1页
第1页 / 共6页
透明网桥的自学习和转发帧算法.doc_第2页
第2页 / 共6页


点击查看更多>>
资源描述
算法描述如下: 自学习:当网桥收到一转发帧时,先查找自己的转发表中是否有源地址,若没有则添加此项。 转发帧:查找自己转发表中是否有目的地址,若没有则将此帧从其他端口转发出去。 若有,则将转发表中记录的目的地址端口和此帧进入网桥时通过的端口进行比较,若相等则丢弃此帧(因为目的主机已经收到此帧了),若不相等,则将此帧通过转发表记录的目的地址端口转发出去。 源码如下:(此代码在突出算法思想的情况下设计的尽量简单,有的情况没有考虑,或者简单处理了。) 1 2 #include<iostream> 3 using namespace std; 4 #define Max_Data 100//转发表数据项数量 5 struct Data//数据项结构 6 { 7 char Add;//地址 8 int port;//端口 9 }; 10 struct SendTable//转发表结构 11 { 12 Data data[Max_Data]; 13 int write;//写指针,指向下一个要写的位置 14 }sendTable; 15 void initSendTable() 16 { 17 for(int i=0;i<Max_Data;i++) 18 { 19 sendTable.data[i].Add='0'; 20 sendTable.data[i].port=0; 21 } 22 sendTable.write=0; 23 } 24 int index;//记录匹配项 25 bool Find(Data data)//查找转发表,若找到返回ture,找不到返回false 26 { 27 for(int i=0;i<Max_Data;i++) 28 { 29 if(sendTable.data[i].Add==data.Add) 30 { 31 index=i; 32 return true; 33 } 34 } 35 return false; 36 } 37 void AddSendTable(Data data)//向转发表当前指针处添加数据项,若转发表满则循环覆盖 38 { 39 sendTable.data[sendTable.write].Add=data.Add; 40 sendTable.data[sendTable.write].port=data.port; 41 sendTable.write=(sendTable.write+1)%Max_Data; 42 } 43 void OutSendTable() 44 { 45 cout<<"********SendTable********"<<"\\n"; 46 for(int i=0;i<sendTable.write;i++)//注意:要是写满在轮转回来的话这种方法就不行了。 47 { 48 cout<<sendTable.data[i].Add<<" "<<sendTable.data[i].port<<"\\n"; 49 } 50 cout<<"*************************"<<"\\n"; 51 } 52 void main() 53 { 54 Data sourceData,destinationData; 55 char source,destination; 56 int port; 57 initSendTable();//初始化转发表 58 while(true) 59 { 60 cout<<"Input Source Address and Prot:\\n"; 61 cin>>source>>port; 62 sourceData.Add=source; 63 sourceData.port=port; 64 cout<<"Input destination Address:\\n"; 65 cin>>destination; 66 destinationData.Add=destination; 67 destinationData.port=0;//由于目的地址不需要输入端口号,此处将其置0 68 if(!Find(sourceData))//查找转发表,若找不到则将源地址添加如转发表 69 AddSendTable(sourceData); 70 if(!Find(destinationData))//查找转发表,若找不到则将此帧从所有其他端口发送给别的网桥 71 cout<<"Send this Data to other bridge through other port\\n"; 72 else 73 { 74 if(sendTable.data[index].port==sourceData.port)//若收到此帧的端口和目的地址再转发表存储的端口相同,说明源地址和目的地址处在同一网段内,目的主机已经收到此帧,须将其丢弃 75 cout<<"This Data already received,so give it up.\\n"; 76 else//若端口不同,则通过查找到的端口将此帧发出 77 cout<<"Send this Data through port "<<sendTable.data[index].port<<"\\n"; 78 } 79 OutSendTable();//打印转发表 80 } 81 } 1 #include<stdio.h> 2 void main() 3 { 4 char arr1[3]={'A','B','C'}; 5 char arr2[2]={'D','E'}; 6 char arr3[3]={'F','G','H'}; 7 int a[][2]={0,0,0,0,0,0,0,0,0,0,0,0}; 8 int b[][2]={0,0,0,0,0,0,0,0,0,0,0,0}; 9 int i,j,m,n,k1 = 0,k2 = 0,t; 10 char s,d,k; 11 12 while(1) 13 { 14 printf("请输入源地址和目的地址:"); 15 scanf("%c%c",&s,&d); 16 printf("\n"); 17 for(i=0;i<3;i++){ 18 if(arr1[i]==s) 19 m=1; 20 } 21 for(i=0;i<2;i++){ 22 if(arr2[i]==s) 23 m=2; 24 } 25 for(i=0;i<3;i++){ 26 if(arr3[i]==s) 27 m=3; 28 } 29 switch(m) 30 { 31 case 1: 32 { 33 for(i=0;i<k1;i++){ 34 if(a[i][0]==s) 35 {break;} 36 } 37 if(i==k1) {a[k1][0]=s;a[k1][1]=m;k1++;}//没有记录,在网桥数组中插入源地址 38 39 for(i=0;i<k1;i++)//查找网桥数组中是否有目的地址 40 { 41 if(a[i][0]==d) 42 { 43 n=a[i][1]; break; 44 } 45 } 46 47 if(i==k1) printf("网桥1中没有目的记录%c,向右转发\n",d);//不含有,转发 48 else 49 { 50 if(m==n){ 51 printf("网桥1丢弃\n");t=1; 52 }//含有且在同在网段丢弃 53 else 54 printf("不在同一网段,网桥1向右转发\n");//含有不在同一网段转发 55 } 56 57 if(t!=1) //不在同一网段时 58 { 59 for(i=0;i<k1;i++) 60 if(b[i][0]==s) {break;} 61 if(i==k1) {b[k2][0]=s;b[k2][1]=m;k2++;}//没有记录,在网桥数组中插入源地址 62 for(i=0;i<k1;i++)//查找网桥数组中是否有目的地址 63 {if(b[i][0]==d) {n=b[i][1]; break;}} 64 if(i==k2) printf("网桥2中没有目的记录%c,向右转发\n",d);//不含有,转发 65 else 66 { 67 if(m==n) printf("网桥2丢弃\n");//含有且在同在网段丢弃 68 else printf("不在同一网段,网桥2向右转发\n");//含有不在同一网段转发 69 } 70 } 71 break; 72 } 73 case 2: 74 { 75 //向左转发 76 for(i=0;i<k1;i++) 77 if(a[i][0]==s) {break;} 78 if(i==k1) {a[k1][0]=s;a[k1][1]=m;k1++;}//没有记录,在网桥数组中插入源地址 79 80 for(i=0;i<k1;i++)//查找网桥数组中是否有目的地址 81 {if(a[i][0]==d) {n=a[i][1]; break;}} 82 83 if(i==k1) printf("网桥1中没有目的记录%c,向左转发\n",d);//不含有,转发 84 else 85 { 86 if(m==n) printf("网桥1丢弃\n");//含有且在同在网段丢弃 87 else printf("不在同一网段,网桥1向左转发\n");//含有不在同一网段转发 88 } 89 //向右转发 90 for(i=0;i<k2;i++) 91 if(b[i][0]==s) {break;} 92 if(i==k2) {b[k2][0]=s;b[k2][1]=m-1;k2++;}//没有记录,在网桥数组中插入源地址 93 94 for(i=0;i<k2;i++)//查找网桥数组中是否有目的地址 95 {if(b[i][0]==d) {n=b[i][1]; break;}} 96 if(i==k2) printf("网桥2中没有目的记录%c,向右转发\n",d);//不含有,转发 97 else 98 { 99 if(1==n) printf("网桥2丢弃\n");//含有且在同在网段丢弃 100 else printf("不在同一网段,网桥2向右转发\n");//含有不在同一网段转发 101 } 102 break; 103 } 104 case 3: 105 { 106 for(i=0;i<k2;i++) 107 if(b[i][0]==s) {break;} 108 if(i==k2) {b[k2][0]=s;b[k2][1]=m-1;k2++;}//没有记录,在网桥数组中插入源地址 109 for(i=0;i<k2;i++)//查找网桥数组中是否有目的地址 110 {if(b[i][0]==d) {n=b[i][1]; break;}} 111 if(i==k2) printf("网桥2中没有目的记录,向左转发\n");//不含有,转发 112 else 113 { 114 if(2==n) {printf("网桥2丢弃\n");t=1;}//含有且在同在网段丢弃 115 else printf("不在同一网段,网桥2向左转发\n");//含有不在同一网段转发 116 } 117 118 if(t!=1)//不在同一网段时 119 { 120 121 for(i=0;i<k1;i++) 122 if(a[i][0]==s) {break;} 123 if(i==k1) {a[k1][0]=s;a[k1][1]=m-1;k1++;}//木有记录,在网桥数组中插入源地址 124 for(i=0;i<k1;i++)//查找网桥数组中是否有目的地址 125 {if(a[i][0]==d) {n=a[i][1]; break;}} 126 if(i==k1) printf("网桥1中没有目的记录%c,向左转发\n",d);//不含有,转发 127 else 128 { 129 if(2==n) printf("网桥1丢弃\n");//含有且在同在网段丢弃 130 else printf("不在同一网段,网桥1向左转发\n");//含有不在同一网段转发 131 } 132 } 133 break; 134 135 } 136 default: ; 137 } 138 139 putchar('\n'); 140 printf("网桥1\n"); 141 printf("--------\n"); 142 for(i=0;i<k1;i++) 143 {printf(" %c ",a[i][0]); 144 printf("%d ",a[i][1]); 145 putchar('\n'); 146 } 147 printf("--------\n"); 148 printf("网桥2\n"); 149 printf("--------\n"); 150 for(i=0;i<k2;i++) 151 {printf(" %c ",b[i][0]); 152 printf("%d ",b[i][1]); 153 putchar('\n'); 154 } 155 printf("-------\n"); 156 scanf("%c",&k); 157 } 158 }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 行业资料 > 医学/心理学

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服