www.pudn.com > bridge.rar > bridge.cpp
#include#include #include typedef struct bridge { char source[4]; int port; bridge *next; }bridge; //转发表的数据结构 class net_bridge { bridge *t; public: net_bridge(); ~net_bridge(); void check_to(char*,char*,int); //查找接受点的端口 int check_from(char*,int); //查找发送点是否在转发表中 void insertion(char*,int); //将新发送点的信息插入转发表中 void print(); //打印转发表 }; net_bridge :: net_bridge() { t = NULL; } net_bridge :: ~net_bridge() { delete []t; } void net_bridge :: check_to(char *from, char *to, int num) { bridge *key; key = t; if(strcmp(from, to) == 0) { cout << "frame from " << from << " to " << to << " arriving at port " << num << " is discarded." << endl; return; } while(key != NULL) { if(strcmp(key->source, to) == 0) //在表中找到该节点 { if(num == key->port) //接受的节点和发送节点在同一端口 cout << "frame from " << from << " to " << to << " arriving at port " << num << " is discarded." << endl; else cout << "frame from " << from << " to " << to << " arriving at port " << num << " is forwarded." << endl; return; } key = key->next; } //在转发表找不到接受节点 cout << "frame from " << from << " to " << to << " arriving at port " << num << " is flooded." << endl; } int net_bridge :: check_from(char *from,int port) { bridge *key; for(key=t; key != NULL; key=key->next) if(strcmp(key->source, from) == 0) //发送节点在转发表中 return 0; cout << "Machine " << from << " is on port " << port << "\n" << endl; return 1; } void net_bridge :: insertion(char *source, int port) { int i; bridge *key = new bridge; for(i=0; i<4; i++) key->source[i] = source[i]; key->port = port; key->next = t; t = key; } void net_bridge :: print() { bridge *key; printf ("最终的转发表输出如下:\n"); for(key=t; key!=NULL; key=key->next) cout << "来源: " << key->source << " 端口: " << key->port << endl; } void main() { FILE * fp1; FILE * fp2; if ((fp1 = fopen ("data1", "r")) == NULL) { printf("不能打开文件\n"); } if ((fp2 = fopen ("data2", "r")) == NULL) { printf("不能打开文件\n"); } net_bridge b; char from [4]; char to [4]; char ch1 = fgetc (fp1); char ch2 = fgetc (fp2); int mark, i, j; mark = 1; i = j = 0; while(ch1 != EOF || ch2 != EOF) { if(mark == 1 && ch1 != EOF) { if(ch1 != ' ') { if(j == 0) { from[i] = ch1; i++; ch1 = fgetc (fp1); } else if(j == 1) { to[i] = ch1; i++; ch1 = fgetc (fp1); } else if(ch1 != '\n') ch1 = fgetc (fp1); else { ch1 = fgetc (fp1); mark = 2; i = 0; j = 0; } } else { if(j == 1) { to[i]= '\0'; b.check_to(from, to, mark); if(b.check_from(from,mark)) b.insertion(from, mark); j = 2; ch1 = fgetc (fp1); } else if (j == 0) { ch1 = fgetc (fp1); from[i]= '\0'; j = 1; i = 0; } } } if(mark == 2 && ch2 != EOF) { if(ch2 != ' ') { if(j == 0) { from[i] = ch2; i++; ch2 = fgetc (fp2); } else if(j == 1) { to[i] = ch2; i++; ch2 = fgetc (fp2); } else if(ch2 != '\n') ch2 = fgetc (fp2); else { ch2 = fgetc (fp2); mark = 1; i = 0; j = 0; } } else { if(j == 1) { ch2 = fgetc (fp2); to[i]= '\0'; b.check_to(from, to, mark); if(b.check_from(from,mark)) b.insertion(from, mark); j = 2; } else if (j == 0) { ch2 = fgetc (fp2); from[i]= '\0'; j = 1; i = 0; } } } } b.print(); }