通过特定路径发送消息

问题描述

我是 Omnet++ 的新手,正在构建我的第一个网络,其中消息必须通过特定路由。这是我正在使用的示例网络的简化版本。

enter image description here

接收请求时,必须经过特定的路由。例如; A->B->E->D->E->C

我的问题是在处理门时出现的。我的第一反应是创建一个特定于每个模块之间连接的 inout 门。所以 A->B 会有自己的 inout 门,B->E 会有自己的 inout 门,等等。但是,随着网络的增长,这会导致需要大量的门管理。

我的第二次尝试是创建和 inout 门阵列。我的连接如下:

    A.nodeGates++ <--> B.nodeGates++;
    A.nodeGates++ <--> C.nodeGates++;
    A.nodeGates++ <--> D.nodeGates++;
    C.nodeGates++ <--> E.nodeGates++;
    B.nodeGates++ <--> E.nodeGates++;
    D.nodeGates++ <--> E.nodeGates++;

在 cpp 文件中,我将在 send(msg,"nodeGates$o",indexId); 函数调用 handleMessage。有没有办法根据模块名称映射 indexId?例如,当我在模块 A 处时,对于路由 A->B->E->D->E->C,我会动态找到要从 A 出发的 indexId B。一旦在 B,我会找到 indexId 去 E 等等。

有没有办法动态查找两个节点之间的 indexId 以遵循精确的路线?

解决方法

在给定的输出 gate 上,您可以调用 getPathEndGate(),这将为您提供连接远端的门。在那个门上调用 getOwnerModule() 会给你远端的模块,然后在那个模块上调用 getFullName() 会给你那个模块的名字。通过这种方式,您可以获得连接到给定输出门的模块的名称。您可以根据该信息做出路由决策。

gate("nodeGates$o",indexId)->getPathEndGate()->getOwnerModule()->getFullName()

见:https://doc.omnetpp.org/omnetpp/api/classomnetpp_1_1cGate.html

还要注意,你必须实现源路由,即你在创建时必须将数据包所需的路径存储在数据包本身中,并且在每一跳上,节点必须丢弃一跳从这个列表中,并根据下一个所需的节点进行路由决策。这样,数据包将通过指定的路径并在最终目的地结束。