#include"pch.h"
#include
#define MAXSIZE 50
#pragma warning(disable : 4996)
struct Data//数据项
{
char MAC;//地址
int Port;//地址接口
};
struct SendTable//转发表
{
Data data[MAXSIZE];//表大小
int next;//指针
}sendTable;
void InitSendTable() {//初始化转发表
int i = 0;
while (i < MAXSIZE) {
sendTable.data[i].MAC ='0';
sendTable.data[i].Port = 0;
i++;
}
sendTable.next = 0;
}
int IsSearch(Data data, int index)//查找转发表
{
for (int i = 0; i < MAXSIZE; i++)
if (sendTable.data[i].MAC == data.MAC) {
index = i;
return 1;
}
return 0;
}
void AddSendTable(Data data)//填表
{
sendTable.data[sendTable.next].MAC=data.MAC;
sendTable.data[sendTable.next].Port=data.Port;
sendTable.next = (sendTable.next+ 1) %MAXSIZE;
}
void OutSendTable() {//出表(转发)
printf("**********转发表**********\n");
int i = 0;
while (i < sendTable.next) {
printf("MAC:%c\tProt:%d\n",
sendTable.data[i].MAC, sendTable.data[i].Port);
i++;
}
printf("**************************\n");
}
int IsInclude(int a[],int x) {//去除当前原站点接口
for (int i = 0; a[i] < MAXSIZE; i++) {
if (x == a[i]) {
return 1;
}
}
return 0;
}
void SendOtherPort(int sourPort, int a[]) {//转发接口
int k=0,l=0;
while (sendTable.data[l].MAC != '0') {
if (sendTable.data[l].Port != sourPort && sendTable.data[l].Port !=0 )
{
if(!IsInclude(a,sendTable.data[l].Port))
a[k++] = sendTable.data[l].Port;
}
l++;
}
}
int main()
{
Data sour, dest;
char mac;
int port, index = 0;
InitSendTable();
while (1) {
printf("输入源地址MAC及Port(空格隔开)\n");
scanf(" %c%d", &mac,&port);
sour.MAC = mac, sour.Port =port;
printf("输入目的地址MAC\n");
scanf(" %c", &mac);
dest.MAC = mac, dest.Port =0;
if (!IsSearch(sour, index)) {
printf("源地址不在转发表中,即将加入转发表!\n\n");
AddSendTable(sour);
}
if (!IsSearch(dest, index)) {
int i = 0, a[MAXSIZE] = { 0 };
printf("目的地址不在转发表中,即将转发到其他接口!\n");
SendOtherPort(sour.Port,a);
while (a[i]!=0)
{
printf("转发此帧到接口:%d\n",a[i]);
i++;
}
}
else if(sendTable.data[index].Port == sour.Port)
printf("目的地址在此接口中,丢弃此帧!\n");
OutSendTable();
}
}