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

本文档详细描述了路由器从端口接收数据的方法CentralRout::ReceiveData,该方法无参数,从数据列表中读取数据包并进行路由计算。如果成功读取,会删除已处理的数据包。
摘要由CSDN通过智能技术生成

 

 

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;

}

 

                                                             <未完>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值