这周网络实验看着孩子们那么苦逼,我真是不忍心,不过还是有比较牛的孩子,老人家落后了啊。因为前几天比较忙,一直再搞论文的实验,所以也没亲自动手做一下,今天刚好有兴致,简单做一下吧,DV算法的简单模拟,没有动态加节点,还有一些问题没有考虑,代码略乱,仅供参考。
/*========================================================================
# FileName: DV.cpp
# Author: daweibalong
# Email: daweibalong@gmail.com
# HomePage:
# LastChange: 2012-11-25 18:50:27
# 编译环境:GCC
========================================================================*/
#include <iostream>
using namespace std;
#define Item_Max 20
#define Router_Max 20
//定义弧
struct ArcNode
{
int adjex;//相邻节点标号
int weight;
struct ArcNode *nextArc;
};
//定义路由表
typedef struct Router
{
int destination;
int cost;
int next_hop;
}RouterItem, RouterTable[Item_Max];
//定义路由节点
struct RouterNode
{
int num;//节点标号
int reachable_num;//可达节点的数目
ArcNode *first;
RouterTable rtable;
};
RouterNode rlist[Router_Max];//路由节点列表
RouterNode rlist_temp[Router_Max];//缓存状态,模拟并发
int router_num;//路由节点数量
//*****函数列表**********
void initRouters();//初始化路由节点及其路由表
int reachable(int, int);//考察第一个节点是否可达第二个节点, 与当前路由表状态有关
bool exchange(int);//制定标号的路由节点获取相邻路由的路由表信息,并根据情况进行路由表的修改
void DV();//循环执行所有路由的信息交换,直至收敛
void printRouterTable(int);//打印路由表
//***********************
//初始化路由节点及路由表
void initRouters()
{
cout << "Please input the number of the routers:";
cin >> router_num;
int i, j;
for (i =0; i < router_num; ++i)
{
rlist[i].num = i;
rlist[i].reachable_num = 0;
rlist[i].first = NULL;
}
int neighbors_num;
cout << "now, tell each node of their neighbors and distance between them:" << endl;
for (i = 0; i < router_num; ++i)
{
cout << "Router(" << i << "):" << endl;
cout << "--the number of neighbors:";
cin >> neighbors_num;
cout << "----neighbor lable and distance:" << endl;
for (j = 0; j < neighbors_num; ++j)
{
ArcNode *arc = new ArcNode;
cout << "------neighbor" << j << ":" << endl;
cout << "--------label:";
cin >> arc->adjex;
cout << "--------weight:";
cin >> arc->weight;
arc->nextArc = rlist[i].first;
rlist[i].first = arc;
rlist[i].rtable[j].destination = arc->adjex;
rlist[i].rtable[j].cost = arc->weight;
rlist[i].rtable[j].next_hop = arc->adjex;
}
rlist[i].reachable_num = neighbors_num;
}
}
//判断node1号路由在目前路由表的情况下是否可达node2号路由
//不可达返回-1
//可达返回cost
int reachable(int node1, int node2)
{
for (int i = 0 ; i < rlist[node1].reachable_num; ++i)
{
if (rlist[node1].rtable[i].destination == node2)
return rlist[node1].rtable[i].cost;
}
return -1;
}
//第num个路由获取邻居节点的路由表并进行更新
bool exchange(int num)
{
ArcNode *arc = rlist[num].first;
bool change = false;
while (arc != NULL)
{
int i;
//get neighbor rtable
for (i = 0; i < rlist[arc->adjex].reachable_num; ++i)
{
//遇见不可达节点,加入路由表
if (num != rlist[arc->adjex].rtable[i].destination && reachable(num, rlist[arc->adjex].rtable[i].destination) == -1)
{
RouterItem item;
item.destination = rlist[arc->adjex].rtable[i].destination;
item.cost =rlist[arc->adjex].rtable[i].cost + arc->weight;
item.next_hop = arc->adjex;
rlist_temp[num].rtable[rlist[num].reachable_num] = item;
rlist_temp[num].reachable_num ++;
change = true;
}
else if (num != rlist[arc->adjex].rtable[i].destination)//遇见可达节点 比较距离 看是否更新路由表
{
if (rlist[num].rtable[i].cost >rlist[arc->adjex].rtable[i].cost + arc->weight)
{
rlist_temp[num].rtable[i].cost =rlist[arc->adjex].rtable[i].cost + arc->weight;
rlist_temp[num].rtable[i].next_hop = arc->adjex;
change = true;
}
}
}
arc = arc->nextArc;
}
return change;
}
//打印单个路由的路由表
void printRouterTable (int num)
{
cout << endl;
cout << "--------Router:" << num << "---------" << endl;
cout << "reachable_num:" << rlist[num].reachable_num << endl;
cout << "des | next | cost" << endl;
for (int i = 0; i < rlist[num].reachable_num; ++i)
{
cout << rlist[num].rtable[i].destination << " | " << rlist[num].rtable[i].next_hop << " | " << rlist[num].rtable[i].cost << endl;
}
}
//DV算法,循环更新,直到收敛
void DV()
{
int i, j = 0;
while (true)
{
bool change = false;
for (i = 0; i < router_num; ++i)
{
rlist_temp[i] = rlist[i];
}
for (i = 0; i < router_num; ++i)
{
change |= exchange(i);
}
if (change == false)
{
cout << "+++++++Converged!++++++++" << endl;
break;
}
for (i = 0; i < router_num; ++i)
{
rlist[i] = rlist_temp[i];
}
cout << endl << "++++++Round " << ++j << "++++++++" << endl;
for (i = 0; i < router_num; i++)
printRouterTable(i);
}
}
int main()
{
initRouters();
DV();
return 0;
}
分享到:
相关推荐
【DV算法模拟软件】 在计算机网络领域,路由选择是网络通信中的关键环节,它决定了数据包如何从源节点传输到目标节点。DV算法(Distance Vector Routing Algorithm)是一种广泛应用的路由选择算法,尤其在局域网和...
标题中的"C语言模拟路由DV算法"指的是使用C语言来实现一种路由算法——距离矢量(Distance Vector, DV)算法。这种算法是网络路由协议中的一种基础算法,常用于解决网络节点间如何有效地传递路由信息的问题。 DV...
在模拟DV路由算法时,Socket可以用来创建服务器和客户端,用于接收和发送路由更新信息。 以下是一个基本的Java实现步骤: 1. **初始化路由器**: 每个路由器实例化为一个Java对象,包含路由表和必要的配置信息,如...
### DV路由选择算法实现样例 本篇将详细介绍一个基于C#实现的DV(Distance Vector)路由选择算法的示例程序。此程序旨在演示DV算法的基本工作原理,并提供了一个简单的图形用户界面(GUI),用于展示路由器的信息...
描述中提到的“网络DV算法源代码比较简单,就是模拟路由器分布式选路”,暗示了这个压缩包内可能包含了一个简单的DV算法实现,用于演示或教学目的。分布式选路是DV算法的核心应用,它让网络中的每个路由器都能够独立...
### DV算法与“坏消息传得慢”的问题 在计算机网络中,路由选择算法负责决定数据包从源节点到目标节点的最佳路径。其中,距离向量(Distance Vector, DV)算法是一种广泛使用的分布式路由算法,它基于每个节点维护...
简单的一个dv路由交换算法,供学习参考
DV Hop算法,可以生成随机矩阵和误差分析。
MATLAB是一款强大的数值计算和数据分析工具,非常适合用于算法开发和模拟。在无线传感器网络的定位问题上,MATLAB能够提供直观的图形界面和高效的计算能力,便于开发者设计、调试和优化算法。 DV-Hop算法的基本步骤...
DVhop算法程序 DV-HOP算法是基于距离和跳数的无线网络节点定位算法。该算法通过计算节点之间的距离和跳数,来估计未知节点的坐标。 DV-HOP算法的主要思想是,首先计算所有节点之间的距离矩阵,然后使用最短路径...
LS 算法与 DV 算法概述 在软件网络技术中,LS 算法(链路状态路由算法)和 DV 算法(距离向量算法)是两种常用的路由算法。LS 算法用于 OSPF 协议,而 DV 算法用于 RIP 和 BGP 协议。 LS 算法是基于图论的路由算法...
本资源"dv.rar_DV算法C_dv rip_静态路由"聚焦于RIP(Routing Information Protocol,路由信息协议)中的距离向量(Distance Vector)算法的C语言实现以及静态路由选择。下面将详细解释这两个核心概念。 首先,我们...
易语言百度DV算法开源源码 解压密码:www.sanye.cx
LS算法和DV算法是两种广泛应用于网络路由中的算法,它们在构建和维护网络路由表时起着关键作用。 LS算法,即链路状态路由算法,典型代表是OSPF(Open Shortest Path First)协议。LS算法的核心思想是路由器通过收集...
在MATLAB中,可以编写程序模拟DV-Hop算法的运行过程,包括节点布局、信号传播、hop计数、距离估计和定位计算等步骤。通过仿真实验,可以直观地观察算法性能,对参数进行调整以优化定位效果。 在提供的1.doc文件中,...
基于DV算法的路由器模拟设计与实现实验报告.doc
DV-Hop算法的基本思想是利用已知位置的参考节点( Anchor Nodes)和其他未知位置的普通节点( Ordinary Nodes)之间的多跳通信来推算距离。以下是对该算法的详细解释: 1. **初始化阶段**:首先,网络中的部分节点...