⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bridge.cpp

📁 简单的网桥实现
💻 CPP
字号:
#include <stdio.h>
#include <iostream.h>
#include <string.h>

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
















	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -