资源描述
算法描述如下:
自学习:当网桥收到一转发帧时,先查找自己的转发表中是否有源地址,若没有则添加此项。
转发帧:查找自己转发表中是否有目的地址,若没有则将此帧从其他端口转发出去。
若有,则将转发表中记录的目的地址端口和此帧进入网桥时通过的端口进行比较,若相等则丢弃此帧(因为目的主机已经收到此帧了),若不相等,则将此帧通过转发表记录的目的地址端口转发出去。
源码如下:(此代码在突出算法思想的情况下设计的尽量简单,有的情况没有考虑,或者简单处理了。)
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 }
展开阅读全文