NS3 的Application类运行机制

初始化相关

继承关系:UdpEchoClient:Application:Object

  • Object::Initialize()
    调用聚合对象指针集合中每一个的指针的DoInitialize().实现多态。
  • Application
    没有重定义Initialize(),但是
    重写DoInitialize():
void Application::DoInitialize (void){
  m_startEvent = Simulator::Schedule (m_startTime, &Application::StartApplication, this);
 m_stopEvent = Simulator::Schedule (m_stopTime, &Application::StopApplication, this);
  Object::DoInitialize ();
}
  • UdpEchoClient()
    重写Application::StartApplication(),Application::StopApplication();
    没有重定义Initialize()与DoInitialize()
void  UdpEchoClient::StartApplication(){
 进行一些配置工作,并且Schedule一些事件,比如Schedule周期性执行的函数的第一次执行
}

Application与Node绑定

  • UdpEchoServerHelper::install(node)
    调用UdpEchoServerHelper::InstallPriv(node)函数,为Application关联与之对应的Node对象指针。
  • Node::AddApplication(app)
    将app存至Node对象的成员变量中。

Application初始化的调用链

  • Node::AddApplication(Application app)
    调用app的Initialize,实际上也就是调用其父类Object的Initialize。
  • Object::Initialize
    Object::Initialize将会调用成员函数DoInitialize。而Application已经覆写DoInitialize函数。所以此处就是调用Application::DoInitialize
  • Application::DoInitialize

Application初始化的调用链

  • Application::DoInitialize
  • Application::StartApplication

first.cc中Application示例解析

udp-echo-client类

  • udp-echo-client的StartApplication函数
1.绑定套接字m_socket
2.连接Server
3. m_socket->SetRecvCallback (MakeCallback (&UdpEchoClient::HandleRead, this));//为m_socket设置接收报文回调函数
4.ScheduleTransmit (Seconds (0.));//在时刻0Schedule一个发送事件
  • ScheduleTransmit函数进一步Schedule函数UdpEchoClient::Send()的执行,添加发送事件。
    • UdpEchoClient::Send()
UdpEchoClient::Send (void)
{
Ptr<Packet> p;
p = Create<Packet> (m_data, m_dataSize);
m_txTrace (p);
m_socket->Send (p);
++m_sent;
if (m_sent < m_count) 
    {
      ScheduleTransmit (m_interval);//每间隔固定时间就Schedule自己的调用,实现添加发送报文事件,从而使得仿真列表中出现新事件推动仿真的进行。
    }
}

项目各个App运行机制设计思路

App的运行机制上也仿照这样来写。大家的模块里面,如果需要在周期性执行的,就在函数内部Schedule自身。然后在Start函数中第一次调用该该函数。而模块的初始化工作放在模块的Init函数完成。

你可能感兴趣的:(NS3)