【計算機網絡實驗】以太網交換機轉發數據幀

題目描述

以太網交換機實質上就是一個多端口的網橋。網橋工做在數據鏈路層,根據MAC幀的目的地址對收到的幀進行轉發或過濾。
當網橋收到一個幀時,並非向全部的端口轉發此幀,而是根據此幀的目的MAC地址,查找網橋中的MAC地址表,而後肯定將該幀轉發到哪個端口,或把它丟棄(即過濾)。
以太網交換機轉發幀的步驟:
先查找交換機的MAC地址表中與收到幀的目的地址有無相匹配的項目。
如沒有,則向全部其餘端口(進入的端口除外)轉發;
若有,則按MAC地址表中給出的端口進行轉發(若MAC地址表中給出的端口就是該幀進入交換機的端口,則應丟棄這個幀)。
現假設有一個24端口的以太網交換機,你的任務是編寫程序對收到的MAC幀進行處理。

輸入描述

輸入的第一行爲兩個正整數M、N(M、N<=24),分別表示交換機的MAC地址表有M行,有N個MAC幀進入交換機。
而後就是M行的MAC地址表,每行包括(MAC地址  對應的端口號  時間),相互之間以空格分隔,其中MAC地址用十六進制表示。
最後N行,每行表示進入交換機的MAC幀相關的信息,包括(目的MAC地址  源MAC地址  進入的端口號  進入的時間),相互之間以空格分隔,其中MAC地址用十六進制表示。

輸出描述

對於每行輸入,輸出以太網交換機處理幀的結果。
輸出(目的MAC地址  外出端口號),其中目的MAC地址佔18位,左對齊,具體格式詳見樣例輸出。
若是是向全部端口轉發,端口號輸出ALL;若是是過濾了,端口號輸出NONE。

輸入樣例

5 3
0001.c7ea.e078 20 172
0009.7c7c.c95e 13 163
0009.7ced.ddc6 5 122
0050.0fc3.7770 10 135
00e0.8fb2.7a69 11 142
0001.c7ea.e078 0001.646a.1e5c 12 4568
0001.422b.486b 0009.7ced.ddc6 5 5888
ffff.ffff.ffff 00e0.8fb2.7a69 11 7600

輸出樣例

0001.c7ea.e078    20
0001.422b.486b    ALL
ffff.ffff.ffff    ALL
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

const int maxn = 1e3 + 10;
string s[maxn];
int num[maxn];
int m, n;

struct Node
{
    string address;
    int num;
}addr[maxn], Addr[maxn];

int main()
{
    string addres, Macadd;
    int time;
    cin >> m >> n;
    int i, j, k;
    int flag;
    for(i = 0; i < m; i++)
    {
        cin >> addr[i].address >> addr[i].num >> time;
    }
    for(i = 0; i < n; i++)
    {
        cin >> Addr[i].address >> addres >> Addr[i].num >> time;
    }
    for(i = 0; i < n; i++)
    {
        flag = 0;
        for(j = 0; j < m; j++)
        {

            if(Addr[i].address == addr[j].address && Addr[i].num != addr[j].num)
            {
                printf("%-18s%-d\n", addr[j].address.c_str(), addr[j].num);
            }
            else if(Addr[i].address == addr[j].address && Addr[i].num == addr[j].num)
            {
                printf("%-18sNONE\n", addr[j].address.c_str());
            }
            else if(Addr[i].address != addr[j].address)
            {
                flag ++;
                k = i;
                //printf("%-18sALL\n", Addr[i].address.c_str());
            }
            //break;
        }
        if(flag == m)
            printf("%-18sALL\n", Addr[k].address.c_str());
    }

    return 0;
}