用C语言实现距离向量算法的过程模拟

来源:互联网 发布:java字符串双引号替换 编辑:程序博客网 时间:2024/05/16 11:00

计算机网络的实验作业拖了好久了,内容是模拟RIP协议,一直想用纯面向过程的思路来写,其中原因并非不喜欢面向对象,而是博主的Java忘的差不多了。。。


今天下午吐血写完,功能实现的不是很好,没写多路由器自由交互,算了,半自由交互勉强可以用


代码如下:

#include <stdio.h>#include <string.h>//定义路由表结构RTabletypedef 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();}


0 0
原创粉丝点击