路由模拟系统 设计方案(二)
实现部分
2004-4-10
说明:本实现部分只介绍主要类的主要接口的实现。
一,网络数据包的产生
网络数据包可以由路由器产生,这里由Net类产生,并传给相应路由器作为起点。因本系统的初衷,所以所有过程的界面都是控制台。如果以后的实现为窗体界面,可以重载或重写这一部分代码。
1,产生网络传输的数据包
方法名称: Net::MakeData
方法参数: 无
返回值: int类型,为数据包起点路由器号。
方法的目的: 由控制台输入正确的起始路由器号与目标路由器号,产生正确的数据包。其中路由器号和路由器地址是一一对映的。
可能的出错: 网络未建: 报错且系统退出。
控制台路由器号输入有误:报错且重新输入。
// 产生网络传输的数据包
int Net::MakeData(void)
{
if(routNum==0 || pNodeArray==NULL)
{
std::cout<<"\n网络为空网络,目前无法生成数据包...\n\n";
exit(-1);
}//
int i=0,j=0;
std::cout<<"\n网络中路由器的标号与地址为:\n"
<<"标号:\t地址"<<std::endl;
for(int k=0;k<routNum;k++)
{// 打印路由器号与地址对应表
std::cout<<k<<":\t";
for(int m=0;m<IP_ADDRESS_LENGTH;m++)
std::cout<<*((pNodeArray+k)->pRout->GetSelfAddress()+m);
std::cout<<std::endl;
}
Loop:
std::cout<<"\n请输入数据包的源路由器的标号:";
std::cin>>i;
std::cout<<"\n请输入数据包的目标路由器的标号:";
std::cin>>j;
if((i< 0)||(i>routNum-1)||(j<0)||(j>routNum-1))
{
std::cout<<"输入的源路由器的标号或目标路由器的标号有错误,请核对...\n\n";
goto Loop;
}
// 产生网络传输的数据包:IPData数据包
NetData ipData(false);
ipData.SetAddressFrom((pNodeArray+i)->pRout->GetSelfAddress());
ipData.SetAddressTo((pNodeArray+j)->pRout->GetSelfAddress());
ipData.SetNextHop((pNodeArray+i)->pRout->GetSelfAddress());
ipData.SetPreHop((pNodeArray+i)->pRout->GetSelfAddress());
// 送给起点路由器
(pNodeArray+i)->pRout->MakeData(ipData);
return i;
}
2, 路由器产生数据
方法名称: AbsRout::MakeData
方法参数: NetData & netData
返回值: 无
方法的目的: 把参数netData拷贝到路由器当前数据包,调用路由计算。
可能的出错: 无
// 产生数据
void AbsRout::MakeData(NetData & netData)
{
currIPData.SetAddressFrom(netData.GetAddressFrom());
currIPData.SetAddressTo(netData.GetAddressTo());
currIPData.SetIPData(netData.GetIPData());
currIPData.SetNextHop(netData.GetNextHop());
currIPData.SetPreHop(netData.GetPreHop());
currIPData.ID = netData.ID;
//---------------------------------------------
std::cout<<"\n产生的数据包:\n";
for(int i=0;i<IP_ADDRESS_LENGTH;i++)
std::cout<<*(netData.GetAddressFrom()+i);
std::cout<<" -> ";
for(int i=0;i<IP_ADDRESS_LENGTH;i++)
std::cout<<*(netData.GetAddressTo()+i);
std::cout<<"\n\nAt Rout:\t";
for(int i=0;i<IP_ADDRESS_LENGTH;i++)
std::cout<<selfAddress[i];
std::cout<<std::endl;
//-----------------------------------------------
if(AddrEqual(currIPData.GetAddressTo(),selfAddress))
return;
DataRoutCompute();
}
<未完>