1. 程式人生 > >用C語言實現距離向量演算法的過程模擬

用C語言實現距離向量演算法的過程模擬

計算機網路的實驗作業拖了好久了,內容是模擬RIP協議,一直想用純面向過程的思路來寫,其中原因並非不喜歡面向物件,而是博主的Java忘的差不多了。。。

今天下午吐血寫完,功能實現的不是很好,沒寫多路由器自由互動,算了,半自由互動勉強可以用

程式碼如下:

#include <stdio.h>
#include <string.h>

//定義路由表結構RTable
typedef struct node{
    char dstNet[5];
    int  distance;
    char nextSkip[5];
}RTable;

RTable RT1[1000];//當前路由器路由表
RTable RT2[1000];//相鄰路由器的路由表
RTable RT3[1000];

int i,l1,l2,l3;
char nearR1[5],nearR2[5];

//基於當前路由器的路由表初始化函式
void InitRTable( RTable* RT ){
    printf("請為當前路由器新增路由表項(目的網路 距離 下一跳路由器):\n");
    for( i=0;i<1000;++i ){
        scanf("%s%d%s",RT[i].dstNet,&RT[i].distance,RT[i].nextSkip);

        if( RT[i].distance==0 ){
            break;
        }
    }
    l1 = i;//記錄RT1[]的長度
}

//相鄰路由器新增函式
void AddNearRouter(){
    printf("\n請輸入第一個相鄰路由器名稱:\n");
    scanf("%s",nearR1);
    printf("請輸入第二個相鄰路由器名稱:\n");
    scanf("%s",nearR2);
}

//基於相鄰路由器的路由表初始化函式
void InitNearRTable(){
    printf("\n請為相鄰路由器%s新增路由表項(目的網路 距離 下一跳路由器):\n",nearR1);
    for( i=0;i<1000;++i ){
        scanf("%s%d%s",RT2[i].dstNet,&RT2[i].distance,RT2[i].nextSkip);

        if( RT2[i].distance==0 ){
            break;
        }
    }
    l2 = i;//記錄RT2[]的長度

    printf("\n請為相鄰路由器%s新增路由表項(目的網路 距離 下一跳路由器):\n",nearR2);
    for( i=0;i<1000;++i ){
        scanf("%s%d%s",RT3[i].dstNet,&RT3[i].distance,RT3[i].nextSkip);

        if( RT3[i].distance==0 ){
            break;
        }
    }
    l3 = i;//記錄RT3[]的長度
}

//路由表更新函式
void UpdateRTable( RTable* RT1,RTable* RT2,char* nearR ){
    int p,q;//p——RT2[],q——RT1[]
    for( p=0;p<l2;++p ){
        int finded=0;
        for( q=0;q<l1;++q ){
            if( strcmp( RT2[p].dstNet,RT1[q].dstNet )==0 ){//當前表中找到與發來的表目的網路相同的一條路由資訊
                finded = 1;
                if( strcmp( RT1[q].nextSkip,nearR )==0 ){//下一跳路由器正好是這個相鄰路由器
                    RT1[q].distance = RT2[p].distance + 1;
                }
                else{//下一跳路由器不是這個
                    if( RT2[p].distance+1<RT1[q].distance ){
                        RT1[q].distance = RT2[p].distance + 1;
                        strcpy( RT1[q].nextSkip,nearR );
                    }
                }
            }
        }
        if( !finded ){//當前表中沒有這條路由資訊,就加上
            strcpy( RT1[l1].dstNet,RT2[p].dstNet );
            RT1[l1].distance = RT2[p].distance + 1;
            strcpy( RT1[l1].nextSkip,nearR );
            ++l1;
        }
    }
}

void Print1(){
    printf("\n----------當前路由器的路由表---------\n");
}

void Print2(){
    printf("\n----------相鄰路由器的路由表---------\n");
}

//路由表列印函式
void PrintRTable( RTable* RT,int len ){
    printf("    目的網路   距離   下一跳路由器\n");
    for( i=0;i<len;++i ){
        printf("      %s      %d          %s\n",RT[i].dstNet,RT[i].distance,RT[i].nextSkip);
    }
    printf("-------------------------------------\n");
}

//路由表更新函式
void Choose_Update(){
    printf("\n請選擇一個傳遞更新資訊的相鄰路由器(1 or 2):\n");
    int choose;
    scanf("%d",&choose);
    if( choose==1 ){
        UpdateRTable(RT1,RT2,nearR1);
    }
    else if( choose==2 ){
        UpdateRTable(RT1,RT3,nearR2);
    }

    printf("\n-------當前路由器更新後的路由表------\n");
    PrintRTable(RT1,l1);
}


int main()
{
    printf("\n-----------距離向量演算法的過程模擬------------\n\n");

    //初始化當前路由器
    InitRTable(RT1);

    //新增相鄰路由器
    AddNearRouter();

    //初始化相鄰路由器
    InitNearRTable();

    //列印當前路由表
    Print1();
    PrintRTable(RT1,l1);

    //列印相鄰路由表
    Print2();
    PrintRTable(RT2,l2);
    Print2();
    PrintRTable(RT3,l3);

    //進行路由表更新
    Choose_Update();
}