资源简介

这是一段模拟路由器的源代码和可执行文件,模拟的是距离向量算法(dv),内有非阻塞socket的具体实现,包含说明文档,希望对初学者有所帮助。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#pragma comment(lib “ws2_32.lib “)

using namespace std;

int nMyPort;

//标志路由表是否改变,如果改变值为true,则打印,否则值为false,不打印
bool bChanged = false;

string sOriginalOupput = ““;
typedef struct DistanceNextHop
{
int nDistance;
int nNext;
vector viPath;
DistanceNextHop()
{
nDistance = 99;
}
}Distance_NextHop;

//string表示路由器的名称,相当于计时器,int初始值为0,如果int>=4则说明string死掉了
map mniRouterCount;

//本路由器的路由信息。
//目的主机名称,距离,下一跳主机名称。
map mnstRouterInformation;

//存储监听端口线程发送来的消息
//第一个string存储源主机的主机名称,第二个存储源主机发来的路由表结构,每行为一个路由表信息,每行包含三个数据
//分别为目的主机,距离, 下一跳主机名称,中间用Tab隔开。
map mnsSocketContent;

//监听端口存储结构
vector vnNeighborPort;
//下一跳与所对应的端口号
map mnnRouterPort;
int nRouterID;

//int nTimes = 0;

//路由表互斥变量。

HANDLE hMutexRoutingTable hMutexKeepAlive hMutexRouterPort;

map miiKeepAlive;


#define ARRAYSIZE 1024
/*
[功能说明]
向另外一个端口发送数据
[参数说明]
char* pContent:发送数据的内容
u_short us:发送数据的目标端口号
[返回值说明]
*/
void Client_Sender(string str u_short us);
/*
[功能说明]
监听端口并接受发送数据

[参数说明]
[返回值说明]
*/
DWORD WINAPI Server_Receive(LPVOID param);
/*
[功能说明]
接受指令

[参数说明]
[返回值说明]
*/
DWORD WINAPI Order(LPVOID param);

/*
[功能说明]
将字符串lpszText按固定特征串lpszDelimiter切分,存入向量vResult中

[参数说明]
lpszText: 待切分串
lpszDelimiter: 切分间隔串
vResult:存储切分结果

[返回值说明]
成功,返回true,否则返回false
*/
bool gfn_bSplit(const char* lpszText vector& vResult const char* lpszDelimiter);

int main(int avgchar* arg)
{
int nNeighborPort = 1;
cin>>nRouterID;
cin>>nMyPort;
while(nNeighborPort != 0)
{
cin>>nNeighborPort;
vnNeighborPort.push_back(nNeighborPort);
}
vnNeighborPort.erase(--vnNeighborPort.end());
//  //测试
//  nRouterID = 1;
//  nMyPort = 3001;
//  vnNeighborPort.push_back(3001);
//  //测试
//路由表添加第一项,即本路由的信息。
Distance_NextHop objDistance_NextHop;
objDistance_NextHop.nDistance = 0;
objDistance_NextHop.nNext = nRouterID;
objDistance_NextHop.viPath.push_back(nRouterID);
mnstRouterInformation[nRouterID] = objDistance_NextHop;


//创建互斥变量
hMutexRoutingTable = ::CreateMutex(NULL TRUE (LPCWSTR)“My_MutexRoutingTable“);
hMutexKeepAlive = ::CreateMutex(NULL TRUE (LPCWSTR)“My_MutexKeepAlive“);
hMutexRouterPort = ::CreateMutex(NULL TRUE (LPCWSTR)“My_MutexRouterPort“);
//动态创建监听端口线程
//动态创建监听端口线程
HANDLE handle handleOrder;
DWORD dw;
handle = ::CreateThread(NULLNULLServer_ReceiveNULL0&dw);
::ResumeThread(handle);
handleOrder = ::CreateThread(NULLNULLOrderNULL0&dw);
::ResumeThread(handleOrder);

string str = ““;
//主程序,先发送自己的路由信息给相邻路由器,发送完成后,处理接收到的信息。
while(1)
{
bChanged = false;
Sleep(2000);
//检查是否有路由器宕机
map::iterator miiIt;
::WaitForSingleobject(hMutexKeepAlive 50L);
for (miiIt=miiKeepAliv

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      38912  2011-11-29 22:32  路由器dv算法模拟\RUN\a\RouterDemo_a.exe

     文件      38912  2011-11-29 22:31  路由器dv算法模拟\RUN\b\RouterDemo_b.exe

     文件      38912  2011-11-29 22:32  路由器dv算法模拟\RUN\c\RouterDemo_c.exe

     文件      38912  2011-11-29 22:32  路由器dv算法模拟\RUN\d\RouterDemo_d.exe

     文件      38912  2011-11-29 22:32  路由器dv算法模拟\RUN\e\RouterDemo_e.exe

     文件      38912  2011-11-29 22:32  路由器dv算法模拟\RUN\f\RouterDemo_f.exe

     文件        224  2011-11-22 21:37  路由器dv算法模拟\RUN\Routers_run.bat

     文件      18209  2011-11-29 13:59  路由器dv算法模拟\SRC\RouterDemo.cpp

     文件     343040  2012-01-16 15:10  路由器dv算法模拟\距离向量算法路由器模拟.doc

     目录          0  2011-11-29 22:34  路由器dv算法模拟\RUN\a

     目录          0  2011-11-29 22:34  路由器dv算法模拟\RUN\b

     目录          0  2011-11-29 22:34  路由器dv算法模拟\RUN\c

     目录          0  2011-11-29 22:34  路由器dv算法模拟\RUN\d

     目录          0  2011-11-29 22:34  路由器dv算法模拟\RUN\e

     目录          0  2011-11-29 22:34  路由器dv算法模拟\RUN\f

     目录          0  2011-11-29 22:34  路由器dv算法模拟\RUN

     目录          0  2011-11-30 00:28  路由器dv算法模拟\SRC

     目录          0  2012-01-16 15:10  路由器dv算法模拟

----------- ---------  ---------- -----  ----

               594945                    18


评论

共有 条评论