dv路由算法c语言实现,路由协议之DV算法

#include

#define ROUTER_OF_NUMBER 100 //网络中路由的最大数目

#define MaxExp 10000

//假设为此路由费用为无穷大

int RouterNum; //网络中路由的个数

//定义一个路由的信息

struct Router

{

int exp; //每条链路的费用

int neighbor; //相邻节点的信息,若两节点相邻设置为1,否则为0

int nexthop; //接收节点的上一跳的地址

};

Router routertable[ROUTER_OF_NUMBER][ROUTER_OF_NUMBER]; //路由表信息

void InitialNodeState(); //初始化节点分布的情况

void PrintNetwork(); //网络生成图

void ExchangeInformation(); //相邻节点间交换链路信息

void DV(int send,int recv);//DV算法

void DisplayRouter(int src,int dst); //显示源节点到目的节点路径

int main()

{

int src,dst;

InitialNodeState();

printf("网络的费用情况\n");

PrintNetwork();

// 因为该网络会不停的更新网络的信息,所以这里的循环次数可以根据网络的拓扑而定,一般设有几个节点就循环多少次

for (int i=0; i 

{

ExchangeInformation();

}

printf("交换完信息网络的最短路由费用情况\n");

PrintNetwork(); //显示寻找完最短路由的网络图

printf("源节点:");

scanf("%d",&src);

printf("目的节点:");

scanf("%d",&dst);

printf("\n");

printf("源节点到目的节点的总费用:%d\n",routertable[src][dst].exp);

printf("\n");

DisplayRouter(src,dst);

}

void InitialNodeState()

{

printf("网络中路由的数目:");

scanf("%d",&RouterNum);

printf("网络中路由的连接情况\n");

for(int i=0; i 

{

for (int j=i+1; j

{

printf("从第%d个节点到第%d个节点的费用:", i,j);

scanf("%d",&routertable[i][j].exp);

routertable[j][i].exp = routertable[i][j].exp;

//假设来回的路由的费用相同

}

}

//通过路由的费用来确认他们之间的相邻关系

for(int m=0; m 

{

for(int n=0; n 

{

if(m==n)

{

routertable[m][n].exp = -1;

routertable[m][n].neighbor = 0;

routertable[m][n].nexthop = -1;

}

else

{

if (routertable[m][n].exp != -1)

//若费用为-1说明两节点无连接,不为相邻的节点

{

routertable[m][n].neighbor = 1;

//说明两个节点是相邻的

routertable[m][n].nexthop = -1;

//初始化时,无上一跳节点

}

else

{

routertable[m][n].neighbor = 0;

routertable[m][n].nexthop = -1;

}

}

}

}

}

void PrintNetwork() //用网格的形式打印出网络中各节点的连接关系

{

printf("\n");

printf("\n");

for(int i=0 ; i <= RouterNum ; i++)

{

for(int j=0 ; j <= RouterNum ; j++)

{

if(i==0)

{

if(j==0)

{

printf(" ");

}

else

{

printf(" %d ", j-1);

}

}

else

{

if(j==0)

{

printf(" %d ", i-1);

}

else

{

if(routertable[i-1][j-1].exp != -1)

{

printf(" %d ",routertable[i-1][j-1].exp);

}

else

{

printf(" * ");

}

}

}

}

printf("\n");

printf("\n");

}

}

void ExchangeInformation()

{

for (int m=0 ; m 

{

for (int n=0 ; n 

{

if(routertable[m][n].neighbor == 1) //相邻节点之间交换链路信息

{

DV(m,n); //通过相邻节点的信息更新发送节点的距离向量

}

}

}

}

void DV(int send,int recv) //接收节点通过接收到的信息来调整自己的距离向量

{

for (int i=0 ; i 

{

if( routertable[send][i].exp > 0) //发送节点到第i节点存在路径

{

if(routertable[recv][i].exp > 0) //接收的节点到第i节点存在路径

{

//重新计算距离向量

if(routertable[recv][i].exp > routertable[recv][send].exp + routertable[send][i].exp)

{

//如果接收节点到其它节点更近,更新其信息列表,把到i节点的最短路径的下一条设置为发送节点

routertable[recv][i].exp = routertable[recv][send].exp + routertable[send][i].exp;

routertable[recv][i].nexthop = send;

}

//否则不做任何的改动

}

else

{

if(recv != i) //相同节点不做任何处理

{

//接收的节点到第i节点的路径不存在,把接收节点到i路径添加到接收节点到i节点最短路径

routertable[recv][i].exp = routertable[recv][send].exp + routertable[send][i].exp;

routertable[recv][i].nexthop = send;

}

}

}

//若发送节点到第i节点路径不存在,仍不做任何的改动

}

}

void DisplayRouter(int src,int dst)

{

if( src = RouterNum || dst = RouterNum)

{

printf("网络中没有您要找的路由\n");

}

int count_router[ROUTER_OF_NUMBER];

//经过路由统计数

count_router[0] = src;

int flag=count_router[0];

//循环控制标志

printf("源节点到目的节点所经过的路径:");

printf("%d->",count_router[0]);

int k=1;

while(flag != -1)

{

count_router[k]=routertable[src][dst].nexthop;

flag=count_router[k];

src = flag ;

if(flag != -1)

{

printf("%d->",count_router[k]);

}

k++;

}

printf("%d\n",dst);

}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LS(Link State)路由算法DV(Distance Vector)路由算法是两种常见的路由算法,它们有着不同的实现方式和特点,下面是它们的比较: 1. 算法原理:LS路由算法是基于全局状态信息的,通过在网络中广播链路状态信息,计算每个节点到其他节点的最短路径,并更新路由表。DV路由算法是基于局部信息的,每个节点只知道与其相邻节点之间的距离和路径,通过不断地更新距离向量表,计算每个节点到目的节点的最短路径。 2. 计算复杂度:LS路由算法需要在整个网络中广播链路状态信息,计算复杂度较高,但是其计算结果准确。DV路由算法只需要在相邻节点之间交换距离向量表,计算复杂度较低,但是容易出现计算误差。 3. 收敛速度:LS路由算法的收敛速度较快,因为每个节点都有全局的状态信息,可以快速计算出最短路径。DV路由算法的收敛速度较慢,因为节点只知道与其相邻节点之间的信息,需要多次更新距离向量表才能达到最优路径。 4. 网络稳定性:LS路由算法在网络拓扑结构发生变化时,需要重新计算链路状态信息,容易产生网络震荡。DV路由算法在网络拓扑结构发生变化时,由于其局部信息的特点,容易产生计算误差和路由环路。 综上所述,LS路由算法DV路由算法各有优缺点,选择哪种算法需要考虑具体的应用场景和要求。如果网络拓扑结构比较稳定,要求路由计算准确性高,则可以选择LS路由算法;如果网络拓扑结构变化频繁,要求路由计算速度快,则可以选择DV路由算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值