OMNET++:如何根据概率向特定节点发送消息



我想进行一个模拟,使节点1有机会根据给定的概率向节点2或节点3发送消息,节点2也应该这样做。然而,如果节点3在任何时候接收到该消息,则该消息被删除。我试着自己做,但没有按我的计划进行。Out1是到达节点1或2的输出,而Out2是到达节点3的输出。当消息从节点1开始并首先到达节点3时,消息会被正确删除,但其他时候它会立即弹出,表示没有更多事件,模拟已完成。我附加了节点的cc文件,我确信其他连接和内容都是正确的。任何建议都将不胜感激,我还是omnet++的新手。谢谢

#include "nodes.h"
Define_Module(Nodes);
void Nodes::initialize()
{
prob1 = .9;
if(strcmp("node1", getName()) == 0){
if (uniform(0, 1) > prob1){
EV << "Sending initial messagen";
cMessage *msg = new cMessage("hw4Msg");
send(msg, "out1");
}
else {
EV << "Sending initial messagen";
cMessage *msg = new cMessage("hw4Msg");
send(msg, "out2");
}
}}
void Nodes::handleMessage(cMessage *msg) {
counter ++;
if((counter == 1)&&(strcmp("node3", getName()) == 0)) {
EV << getName() << "'s counter is " << counter << ", meaning ";
EV << getName() << " has captured the packet. The message will now be deleted.";
delete msg;
}
prob2 = .9;
if(strcmp("node1", getName()) == 0) {
if (uniform(0, 1) > prob2) {
EV << getName() << " Received message " << msg->getName() << " ,sending it out againn";
EV << getName() << "'s counter is " << counter;
send(msg, "out1");
}
else {
EV << getName() << " Received message " << msg->getName();
send(msg, "out2");
}}
if(strcmp("node2", getName()) == 0) {
if (uniform(0, 1) < prob2) {
EV << getName() << " Received message " << msg->getName() << " ,sending it out againn";
EV << getName() << "'s counter is " << counter;
send(msg, "out1");
}
else {
EV << getName() << " Received message " << msg->getName();
send(msg, "out2");
}
}}

您的模型缺少什么:您打算如何生成数据包。在当前代码中,您生成一条消息(在node1中的initialize()方法中(,然后将其发送给其他节点。一旦它找到了通往node3的路,消息就会被删除,并且没有更多的事件可供模拟,因此它停止。

否则,它不能立即完成,因为第一条消息要么先进入node3,然后在下一个事件中被删除,要么进入node2,根据您的代码转发到node1node3

除非您在NED文件中键入了错误的node2名称。但无论哪种方式,您都应该在Qtenv中单步执行,并逐一查看每个事件。

附带说明一下,该场景可以(几乎(使用samples/queueinglib中的模块(Source、Sink和Classifier模块(进行完全建模。我强烈建议看一下那个样品。

最新更新