路由模拟——设计方案的实现(5)

类别:VC语言 点击:0 评论:0 推荐:

 

 

2, 路由器从端口接收数据

方法名称:              CentralRout::ReceiveData

方法参数:             无

返回值:               无

方法的目的:           路由器从路由器端口读数据的过程。如果成功则执行路由计算。

可能的出错:           无

// 路由器从端口接收数据

void CentralRout::ReceiveData(void)

{

     dataIter = dataInList.begin();

     if(dataIter != dataInList.end())

     {//读取一个数据包

          currIPData.SetAddressFrom(dataIter->GetAddressFrom());

          currIPData.SetAddressTo(dataIter->GetAddressTo());

          currIPData.SetNextHop(dataIter->GetNextHop());

          currIPData.SetPreHop(dataIter->GetPreHop());

          currIPData.ID = dataIter->ID;

          currIPData.SetIPData(dataIter->GetIPData());

         //从端口删除所取数据包

          dataInList.erase(dataIter);

          dataListLength --;

         //执行路由计算

          DataRoutCompute();

     }

}

3, 对当前数据包进行路由计算

方法名称:              AbsRout::DataRoutCompute

方法参数:             无

返回值:               无

方法的目的:           路由器对当前数据包进行计算,以判断它要被送往哪一个路由器。然后调用路由器向端口写数据的过程。

可能的出错:           无

// 对当前数据包进行路由计算

void AbsRout::DataRoutCompute(void)

{

     currIPData.SetPreHop(selfAddress);

     unsigned int *addr=routTable.GetAddrNextHop(currIPData.GetAddressTo());

     currIPData.SetNextHop(addr);

 

     //------------------------------------------------

     //向控制台输出提示信息

     std::cout<<"\n\t计算成功...";

     std::cout<<"\n\tNext Hop:";

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

          std::cout<<addr[i];

     std::cout<<std::endl;

     //------------------------------------------------

     SendData();

}

 

4, 路由器向端口发送数据

方法名称:              CentralRout::SendData

方法参数:             无

返回值:               无

方法的目的:           路由器向端口写数据的过程。

可能的出错:           无

// 路由器向端口发送数据

void CentralRout::SendData(void)

{

     dataOutList.push_back(currIPData);

}

5, 网络从路由器端口接收数据

方法名称:              CentralRout::NetReadData

方法参数:             无

返回值:                NetData *

方法的目的:           网络从路由器端口中读取数据包的拷贝,将该数据包拷贝返回。IPData和Message作不同的处理。本方案实现较为简洁,实时模拟需要扩充代码。

可能的出错:           无

// 网络从路由器端口接收数据

NetData * CentralRout::NetReadData()

{

     NetData *_netData = NULL;

     dataIter = dataOutList.begin();

     if(dataIter!=dataOutList.end())

     {

          if(!dataIter->IsMessage())

         {

              _netData = new NetData(false);

              _netData->SetAddressFrom(dataIter->GetAddressFrom());

              _netData->SetAddressTo(dataIter->GetAddressTo());

              _netData->SetPreHop(dataIter->GetPreHop());

              _netData->SetNextHop(dataIter->GetNextHop());

               _netData->ID = dataIter->ID;

              _netData->SetIPData(dataIter->GetIPData());

              //从语义上讲,路由器每送出一个数据包,就应该启动一个记时器,

              //以等待应答消息;或者某种机制代替记时器,来做重传的依据。

              //代码待扩充。

         }else if(dataIter->IsMessage())

         {

              _netData = new NetData(true);

              _netData->SetAddressFrom(dataIter->GetAddressFrom());

              _netData->SetAddressTo(dataIter->GetAddressTo());

              _netData->SetPreHop(dataIter->GetPreHop());

              _netData->SetNextHop(dataIter->GetNextHop());

              _netData->ID = dataIter->ID;

              //应答消息不重传

              dataOutList.erase(dataIter);

         }//end of else if

     }//end of if

 

     return _netData;

}

 

                                                             <未完>

 

本文地址:http://com.8s8s.com/it/it960.htm