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(); 
}