什么时候在 OMNet++ 中使用 send、sendDirect 和 sendDelayed?

When to use send, sendDirect and sendDelayed in OMNet++?

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

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

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

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

首先澄清一下:使用 send()sendDirect() 不会 增加延迟。如果您通过正常渠道发送消息或使用 sendDirect() 消息将在当前模拟时间(即现在)传递到目标模块。当消息在目的地被处理时,仿真叉将是相同的,因此仿真时间没有额外的延迟。 sendDelayed() 显然增加了延迟,但这无论如何是它的主要目的。

您必须决定是要使用消息传递作为模块之间的通信方式(这是异步的),还是要直接调用另一个模块(即同步的)。在第一种情况下,您可以使用 OMNeT++ 的调度函数(即 sendsendDelayedsendDirect 等)。在第二种情况下,您通常通过获取指向它的指针并可能使用 check_and_cast<> 将其转换为适当的类型来直接调用另一个模块。 getParentModule()findSubmodule() 等方法在这里很有用,可以获取指向所需模块的指针。

当模块之间的通信被认为是'implementation'细节时,直接调用是有用的。它也更快(就 CPU 使用而言)和同步(因此您可以获得 return 值)。

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

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