Fonction de pont analogique

1. Ecrivez un programme pour simuler la fonction de pont réseau.
La simulation réalise la fonction de transfert du pont, lit les trames du fichier et simule que le pont reçoit une trame du réseau, c'est-à-dire lit une série de trames à partir de deux fichiers, lit une trame du premier fichier, puis lit une image du premier fichier. Lire une autre image dans les deux fichiers, et ainsi de suite. Pour chaque trame, indiquez si le pont transférera et affichez le contenu de la table de transfert.
Exigences: Exécutez sous un environnement Windows ou Linux, et le programme doit s'exécuter sur un seul ordinateur.
Analyse: utilisez le programme pour simuler la fonction de pont de réseau. On peut supposer que deux fichiers sont utilisés pour représenter les données de trame de réseau sur les deux segments de réseau. Les données des deux fichiers doivent avoir les caractéristiques d'une trame, c'est-à-dire une adresse de destination, une adresse source et des données dans la trame. Le programme lit les données de la trame en alternance, ce qui équivaut à ce que le pont obtient les données de trame du segment de réseau.
Pour le pont, si la trame peut être transmise, il faut comparer la trame reçue avec la table de transfert dans le pont. Après avoir évalué l'adresse de destination, décidez de transférer ou non. On peut voir que la clé du transfert est de construire une table de transfert. Ici, la table de transfert peut être générée dynamiquement.


L'organigramme du programme est le suivant: Le
Insérez la description de l'image ici


format du contenu du fichier est le suivant: le
Insérez la description de l'image ici
code source est le suivant:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct ForwardItem    //转发项
{
    
    
	char mac[15];       //mac地址
	int port;               //端口号
};
struct ForwardTable         //转发表
{
    
    
	ForwardItem forwarditem[100];         //转发表中最大可以保存100条记录
	int count;                                        //转发项的条数
};
int main()
{
    
    
	ifstream port1, port2;
	port1.open("port11.txt", ios::in);             //打开文件port1.txt
	if (!port1)       //若打开文件port1.txt失败,则退出程序
	{
    
    
		cout << "打开文件port11.txt失败" << endl;  
		exit(1);            
	}
	port2.open("port22.txt", ios::in);     //打开文件port2.txt
	if (!port2)     //若打开文件port2.txt失败,则退出程序
	{
    
    
		cout << "打开文件port22.txt失败" << endl;
		exit(1);
	}
	int time = 0;           //time等于偶数时,从文件一读取数据;time等于奇数时,从文件二读取数据
	int flag1 = 1, flag2 = 1;  //flag1和flag2用来标记文件是否已被读完
	int port;
	char source[15], destination[15];
	ForwardTable forwardtable;
	forwardtable.count = 0;
	string temp;
	getline(port1, temp);       //读取文件开头的一行文字
	getline(port2, temp);
	while (1)
	{
    
    
		if (!(time %2) && flag1 == 1)   //time等于偶数且文件一中还存在未读数据
		{
    
    
			if (port1 >> destination >> source )  //从文件一中读取数据
			{
    
    
				flag1 = 1;
				port = 1;
			}
			else
			{
    
    
				flag1 = 0;
				if (port2 >> destination >> source)
					flag2 = 1;
				else flag2 = 0;
			}
		}
		if ((time % 2) && flag2 == 1)   //time等于奇数且文件一中还存在未读数据
		{
    
    
			if (port2 >> destination >> source) //从文件二中读取数据
			{
    
    
				flag2 = 1;
				port = 2;

			}
			else
			{
    
    
				flag2 = 0;
				if (port1 >> destination >> source)
					flag1 = 1;
				else flag1 = 0;
			}
		}
		time++;
		if (flag1 || flag2)      
		{
    
    
			cout << "当前转发表为:" << endl;
			cout << "mac" << "             " << "port" << endl;
			for (int i = 0; i < forwardtable.count; i++)   //打印当前转发表
			{
    
    
				cout << forwardtable.forwarditem[i].mac << "\t" << forwardtable.forwarditem[i].port << endl;
			}
			cout << "端口" << port << "收到源mac为" << source << ",目的mac为" << destination << "的帧" << endl;
		
			int i;
			for (i = 0; i < forwardtable.count; i++)    //查找转发表
			{
    
    
				if (!strcmp(forwardtable.forwarditem[i].mac, destination))    //查找成功
				{
    
    
					cout << "查找转发表成功!" ;
					if (forwardtable.forwarditem[i].port == port)   //源mac和目的mac所在的端口相同
						cout << "源mac和目的mac所在的端口相同,网桥不转发" << endl;
					else
						cout << "源mac和目的mac所在的端口不同,往端口" << forwardtable.forwarditem[i].port << "进行转发" << endl;
					break;
				}
			}
			if (i == forwardtable.count)      //无法找到该转发地址
			{
    
    
				cout << "无法找到该转发地址!" ;
				cout << "向所有的端口转发这个帧(除了端口" << port << ")" << endl;
			}
			int count;
			for (count = 0; count < forwardtable.count; count++)    //查看转发表中是否存在源mac项
			{
    
    
				if (!strcmp(forwardtable.forwarditem[count].mac, source))
				{
    
    
					break;
				}
			}
			if (count == forwardtable.count)  //如果转发表中不存在源mac项,就进行自学习
			{
    
    
				cout << "转发表中不存在源mac项,进行自学习" << endl;
				strcpy_s(forwardtable.forwarditem[forwardtable.count].mac, source);
				forwardtable.forwarditem[forwardtable.count].port = port;
				forwardtable.count++;
				cout << "更新后的转发表为:" << endl;
				cout << "mac" << "             " << "port" << endl;
				for (int j = 0; j < forwardtable.count; j++)
				{
    
    
					cout << forwardtable.forwarditem[j].mac << "\t" << forwardtable.forwarditem[j].port << endl;
				}
			}
			cout << "----------------------------------------------------------------------" << endl;
		}
		else break;
	}
}

Si cela vous aide, veuillez féliciter

Je suppose que tu aimes

Origine blog.csdn.net/qq_44933518/article/details/105461812
conseillé
Classement