用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();
}


  • 3
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
用C写的rip协议 这是其中的广播request程序片段: void RouteInit() { int i,optval=0,length,error; routeNum = 0; // init local socket address and ip address GetLocalIP(); // init route table items for(i = 0; i < MAX_NUM; i++) { SetRouteEntry(&routeTable[i].routeInfo,"0.0.0.0",0,0); routeTable[i].isvalid = 0; routeTable[i].timer = 0; routeTable[i].statue = 0; inet_aton("0,0,0,0",&routeTable[i].sourceIPAddr); } // init request packet SetRoutePacket(&reqPacket,REQUEST); SetRouteEntry(&reqPacket.routeEntry[0],"0.0.0.0",0,16); // init response packet SetRoutePacket(&resPacket,RESPONSE); recvSockAddr.sin_family = AF_INET; recvSockAddr.sin_port = htons(PORT); recvSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); sendSockAddr.sin_family = AF_INET; sendSockAddr.sin_port = htons(PORT); // inet_aton("240.255.255.255",&sendSockAddr.sin_addr); sendSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); EntryInit(); sock = socket(AF_INET,SOCK_DGRAM,0); if(sock<0) { printf("cannot create a socket!\n"); exit(1); } if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&optval,sizeof(int)) != 0) { printf("cannot broadcast!\n"); close(sock); exit(1); } if(bind(sock,(struct sockaddr*)&recvSockAddr,sizeof(recvSockAddr))<0) { printf("cannot bind to port\n"); close(sock); exit(1); } length=sizeof recvSockAddr; getsockname(sock,(struct sockaddr*)&recvSockAddr,&length); printf("Port %d is opened. Listen for packet...\n",ntohs(recvSockAddr.sin_port)); FD_ZERO(&fdSet); FD_SET(sock,&fdSet); error = sendto(sock,&reqPacket,4+sizeof(struct ROUTE_ENTRY),0,(struct sockaddr*)(&sendSockAddr),sizeof(struct sockaddr)); if(error<0) { PrintEntry(&reqPacket.routeEntry[0]); printf("broadcast request packet failed! %d,%d,%d\n",error,sock,fdSet); } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder Ben

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值