ns3使用-2
ns3计划事件:Schedule函数
前面提到,trace一般位于网络拓扑和应用建立以后,Simulator::Run()
之前。但也有例外,比如套接字对象。Socket对象是在应用程序启动之后才被创建,因此直接在脚本中为Socket对象的trace变量设置回调函数会引起程序崩溃。一个比较通用的做法是使用Schedule()函数使配置trace的时间点在应用程序启动之后。
我们可以把事件简单的理解为一个执行某种操作的C++函数。形式为:
1 | static void AdvancePosition(Ptr<Node>node); //定义一个函数指针 |
回调函数也可以是一个类的成员函数。
1 | void Myapp::ScheduleTx(void) |
如果想立即执行操作,就要将Schedule()
第一个参数设置为当前时间,可以通过Simulator::Now().GetSeconds()
获取当前时间或者直接用ScheduleNow()
,其没有延时参数,其余和Schedule()
完全一样
ns-3脚本中一些计划时间的操作内部就是通过Schedule()
或者ScheduleNow()
实现的
- ns-3的事件调度:将网络过程分成一个个离散的事件,按照事件发生的先后执行
- ns-3的时间:模拟器的时间除了使用实时模拟器时都是虚拟的。
ns3回调函数:Callback类
C++中回调函数的用法:
1 | //普通回调函数 |
ns-3将为了统一C语言风格函数和类内函数,回调函数都封装了起来,最多支持9个形参。示例代码如下:
1 | //定义回调函数签名格式:返回值void,形参int |
通过MakeBoundCallback()
函数可以创建自带绑定参数的函数指针,也就是可以手动加入Callback
的形参。
1 | void MyBoundFunction(Ptr<OutputStreamWrapper>stream,int arg) |