何时在OMNet ++中使用send,sendDirect和sendDelayed?

时间:2016-03-18 09:24:27

标签: omnet++

我在omnet ++中构建自己的复合模块,其中包含多个简单模块,并具有分层架构。但是在模块间通信中仅使用send()(比如我的App生成器使用send()将数据包发送到缓冲区下方)似乎会增加总网络延迟。

另外,我已经看到其他支持良好的模型,如inet,mixim等,使用sendDirect和send和sendDelayed交替使用。

所以,我的问题是,何时使用send()sendDirect()sendDelayed()? 他们有任何延迟差异吗?

1 个答案:

答案 0 :(得分:4)

有几种方法可以在模块之间交换信息。您使用哪一个取决于您传递的数据以及与协议本身相关的交换量。

首先澄清:使用ButtonPressedsend() NOT 会增加延迟。如果您通过普通频道发送消息或使用sendDirect(),则消息将在当前模拟时间(即现在)传送到目标模块。当在目的地处理消息时,模拟时间将是相同的,因此模拟时间没有额外的延迟。 sendDirect()显然会增加延迟,但无论如何这都是它的主要目的。

您必须决定是否要将消息传递用作模块之间的通信方式(这是异步的),或者您希望直接调用其他模块(即同步)。在第一种情况下,您可以使用OMNeT ++的调度功能(即sendDelayed()sendsendDelayed等)。在第二种情况下,您通常通过获取指向它的指针直接调用另一个模块,并可能使用sendDirect将其强制转换为适当的类型。像check_and_cast<>getParentModule()这样的方法在这里很有用,可以获得指向所需模块的指针。

当模块之间的通信被视为“实现”细节时,直接调用很有用。它也更快(在CPU使用方面)和同步(因此你可以得到一个返回值)。

如果您使用GUI运行时环境传递要在模拟期间检查的数据(即您希望看到小点飞来飞去),那么您应该使用消息定义和findSubmodule() / {{1等等。

最后,send()sendDirect()之间存在差异。如果您有通过通道连接门的拓扑(即您现在提前通信),则通常使用send()(例如有线网络)。如果您事先不知道通信路径,那么您通常会获得指向目标模块的指针,但之后您将使用sendDirect()发送异步消息。这通常是无线网络中的情况。