`
daweibalong
  • 浏览: 45596 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

DV算法模拟,仅供参考

阅读更多

这周网络实验看着孩子们那么苦逼,我真是不忍心,不过还是有比较牛的孩子,老人家落后了啊。因为前几天比较忙,一直再搞论文的实验,所以也没亲自动手做一下,今天刚好有兴致,简单做一下吧,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算法模拟软件】 在计算机网络领域,路由选择是网络通信中的关键环节,它决定了数据包如何从源节点传输到目标节点。DV算法(Distance Vector Routing Algorithm)是一种广泛应用的路由选择算法,尤其在局域网和...

    C语言模拟路由DV算法

    标题中的"C语言模拟路由DV算法"指的是使用C语言来实现一种路由算法——距离矢量(Distance Vector, DV)算法。这种算法是网络路由协议中的一种基础算法,常用于解决网络节点间如何有效地传递路由信息的问题。 DV...

    dv路由算法 java模拟

    在模拟DV路由算法时,Socket可以用来创建服务器和客户端,用于接收和发送路由更新信息。 以下是一个基本的Java实现步骤: 1. **初始化路由器**: 每个路由器实例化为一个Java对象,包含路由表和必要的配置信息,如...

    DV路由选择算法实现样例

    ### DV路由选择算法实现样例 本篇将详细介绍一个基于C#实现的DV(Distance Vector)路由选择算法的示例程序。此程序旨在演示DV算法的基本工作原理,并提供了一个简单的图形用户界面(GUI),用于展示路由器的信息...

    DV.rar_DV-Distance_DV算法_Dv-distance 代码_dv

    描述中提到的“网络DV算法源代码比较简单,就是模拟路由器分布式选路”,暗示了这个压缩包内可能包含了一个简单的DV算法实现,用于演示或教学目的。分布式选路是DV算法的核心应用,它让网络中的每个路由器都能够独立...

    DV算法对坏消息传的慢

    ### DV算法与“坏消息传得慢”的问题 在计算机网络中,路由选择算法负责决定数据包从源节点到目标节点的最佳路径。其中,距离向量(Distance Vector, DV)算法是一种广泛使用的分布式路由算法,它基于每个节点维护...

    dv路由交换算法实现

    简单的一个dv路由交换算法,供学习参考

    DV Hop 算法

    DV Hop算法,可以生成随机矩阵和误差分析。

    DV-Hop算法.rar_dv hop_dv hop localization_dv-hop_定位算法

    MATLAB是一款强大的数值计算和数据分析工具,非常适合用于算法开发和模拟。在无线传感器网络的定位问题上,MATLAB能够提供直观的图形界面和高效的计算能力,便于开发者设计、调试和优化算法。 DV-Hop算法的基本步骤...

    DVhop算法程序

    DVhop算法程序 DV-HOP算法是基于距离和跳数的无线网络节点定位算法。该算法通过计算节点之间的距离和跳数,来估计未知节点的坐标。 DV-HOP算法的主要思想是,首先计算所有节点之间的距离矩阵,然后使用最短路径...

    LS算法与DV算法[归纳].pdf

    LS 算法与 DV 算法概述 在软件网络技术中,LS 算法(链路状态路由算法)和 DV 算法(距离向量算法)是两种常用的路由算法。LS 算法用于 OSPF 协议,而 DV 算法用于 RIP 和 BGP 协议。 LS 算法是基于图论的路由算法...

    dv.rar_DV算法C_dv rip_静态路由

    本资源"dv.rar_DV算法C_dv rip_静态路由"聚焦于RIP(Routing Information Protocol,路由信息协议)中的距离向量(Distance Vector)算法的C语言实现以及静态路由选择。下面将详细解释这两个核心概念。 首先,我们...

    e语言-易语言百度DV算法开源

    易语言百度DV算法开源源码 解压密码:www.sanye.cx

    LS算法与DV算法借鉴.pdf

    LS算法和DV算法是两种广泛应用于网络路由中的算法,它们在构建和维护网络路由表时起着关键作用。 LS算法,即链路状态路由算法,典型代表是OSPF(Open Shortest Path First)协议。LS算法的核心思想是路由器通过收集...

    DV-Hop定位算法

    在MATLAB中,可以编写程序模拟DV-Hop算法的运行过程,包括节点布局、信号传播、hop计数、距离估计和定位计算等步骤。通过仿真实验,可以直观地观察算法性能,对参数进行调整以优化定位效果。 在提供的1.doc文件中,...

    基于DV算法的路由器模拟设计与实现实验报告.doc

    基于DV算法的路由器模拟设计与实现实验报告.doc

    定位算法代码(2)_dv-hop_DV-Hop定位_

    DV-Hop算法的基本思想是利用已知位置的参考节点( Anchor Nodes)和其他未知位置的普通节点( Ordinary Nodes)之间的多跳通信来推算距离。以下是对该算法的详细解释: 1. **初始化阶段**:首先,网络中的部分节点...

Global site tag (gtag.js) - Google Analytics