1、算法描述如下:自学习:当网桥收到一转发帧时,先查找自己的转发表中是否有源地址,若没有则添加此项。转发帧:查找自己转发表中是否有目的地址,若没有则将此帧从其他端口转发出去。若有,则将转发表中记录的目的地址端口和此帧进入网桥时通过的端口进行比较,若相等则丢弃此帧(因为目的主机已经收到此帧了),若不相等,则将此帧通过转发表记录的目的地址端口转发出去。源码如下:(此代码在突出算法思想的情况下设计的尽量简单,有的情况没有考虑,或者简单处理了。) #include using namespace std; #define Max_Data 100/转发表数据项数量 struct Data/数据项结构 ch
2、ar Add;/地址 int port;/端口 ; struct SendTable/转发表结构 Data dataMax_Data; int write;/写指针,指向下一个要写的位置 sendTable; void initSendTable() for(int i=0;isourceport; sourceData.Add=source; sourceData.port=port; coutdestination; destinationData.Add=destination; destinationData.port=0;/由于目的地址不需要输入端口号,此处将其置0 if(!Find
3、(sourceData)/查找转发表,若找不到则将源地址添加如转发表 AddSendTable(sourceData); if(!Find(destinationData)/查找转发表,若找不到则将此帧从所有其他端口发送给别的网桥 cout void main() char arr13=A,B,C; char arr22=D,E; char arr33=F,G,H; int a2=0,0,0,0,0,0,0,0,0,0,0,0; int b2=0,0,0,0,0,0,0,0,0,0,0,0; int i,j,m,n,k1 = 0,k2 = 0,t; char s,d,k; while(1) p
4、rintf(“请输入源地址和目的地址:“); scanf(“%c%c“, printf(“n“); for(i=0;i3;i+) if(arr1i=s) m=1; for(i=0;i2;i+) if(arr2i=s) m=2; for(i=0;i3;i+) if(arr3i=s) m=3; switch(m) case 1: for(i=0;ik1;i+) if(ai0=s) break; if(i=k1) ak10=s;ak11=m;k1+;/没有记录,在网桥数组中插入源地址 for(i=0;ik1;i+)/查找网桥数组中是否有目的地址 if(ai0=d) n=ai1; break; if(
5、i=k1) printf(“网桥1中没有目的记录%c,向右转发n“,d);/ 不含有,转发 else if(m=n) printf(“网桥1丢弃n“);t=1; /含有且在同在网段丢弃 else printf(“不在同一网段,网桥1向右转发n“); /含有不在同一网段转发 if(t!=1) /不在同一网段时 for(i=0;ik1;i+) if(bi0=s) break; if(i=k1) bk20=s;bk21=m;k2+;/没有记录,在网桥数组中插入源地址 for(i=0;ik1;i+)/查找网桥数组中是否有目的地址 if(bi0=d) n=bi1; break; if(i=k2) pri
6、ntf(“网桥2中没有目的记录%c,向右转发 n“,d);/不含有,转发 else if(m=n) printf(“网桥2丢弃n“); /含有且在同在网段丢弃 else printf(“不在同一网段,网桥2向右转发 n“);/含有不在同一网段转发 break; case 2: /向左转发 for(i=0;ik1;i+) if(ai0=s) break; if(i=k1) ak10=s;ak11=m;k1+;/没有记录,在网桥数组中插入源地址 for(i=0;ik1;i+)/查找网桥数组中是否有目的地址 if(ai0=d) n=ai1; break; if(i=k1) printf(“网桥1中没
7、有目的记录%c,向左转发 n“,d);/不含有,转发 else if(m=n) printf(“网桥1丢弃n“); /含有且在同在网段丢弃 else printf(“不在同一网段,网桥1向左转发n“);/含有不在同一网段转发 /向右转发 for(i=0;ik2;i+) if(bi0=s) break; if(i=k2) bk20=s;bk21=m-1;k2+;/没有记录,在网桥数组中插入源地址 for(i=0;ik2;i+)/查找网桥数组中是否有目的地址 if(bi0=d) n=bi1; break; if(i=k2) printf(“网桥2中没有目的记录%c,向右转发 n“,d);/不含有,
8、转发 else if(1=n) printf(“网桥2丢弃n“); /含有且在同在网段丢弃 else printf(“不在同一网段,网桥2向右转发 n“);/含有不在同一网段转发 break; case 3: for(i=0;ik2;i+) if(bi0=s) break; if(i=k2) bk20=s;bk21=m-1;k2+;/没有记录,在网桥数组中插入源地址 for(i=0;ik2;i+)/查找网桥数组中是否有目的地址 if(bi0=d) n=bi1; break; if(i=k2) printf(“网桥2中没有目的记录,向左转发n“ );/不含有,转发 else if(2=n) pr
9、intf(“网桥2丢弃n“);t=1; /含有且在同在网段丢弃 else printf(“不在同一网段,网桥2向左转发n“);/含有不在同一网段转发 if(t!=1)/不在同一网段时 for(i=0;ik1;i+) if(ai0=s) break; if(i=k1) ak10=s;ak11=m-1;k1+;/木有记录,在网桥数组中插入源地址 for(i=0;ik1;i+)/查找网桥数组中是否有目的地址 if(ai0=d) n=ai1; break; if(i=k1) printf(“网桥1中没有目的记录%c ,向左转发n“,d);/ 不含有,转发 else if(2=n) printf(“网桥
10、1丢弃n“); /含有且在同在网段丢弃 else printf(“不在同一网段,网桥1向左转发 n“);/含有不在同一网段转发 break; default: ; putchar(n); printf(“网桥1n“ ); printf(“-n“); for(i=0;ik1;i+) printf(“ %c “,ai0); printf(“%d “,ai1); putchar(n); printf(“-n“); printf(“网桥2n“ ); printf(“-n“); for(i=0;ik2;i+) printf(“ %c “,bi0); printf(“%d “,bi1); putchar(n); printf(“-n“); scanf(“%c“,