【问题标题】:unable to delete msg when reaches to the destination in omnet++?在 omnet++ 中到达目的地时无法删除味精?
【发布时间】:2020-03-26 04:53:39
【问题描述】:

我是 OMNeT++ 的新手,我想创建一个简单的广播机制,在该机制中,起始节点发送一个 msg,并将其广播到以网状拓扑连接的所有节点。当 msg 到达目的地时,该 msg 将被删除,不再广播。连续两天,我都在按照它的官方文档进行处理。我的代码已成功模拟。但是当它到达目的地时它不会删除味精。我从 25 个节点(计算机)开始,其中源节点是 computer0,目标节点是 computer24。告诉我,我哪里错了。以下是我的源代码:

#include <stdio.h>
#include <string.h>
#include <omnetpp.h>

using namespace omnetpp;

class computer : public cSimpleModule
{
protected:
    virtual void forwardMessage(cMessage *msg);
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(computer);

void computer::initialize()
{
    if (getIndex() == 0) {

        char msgname[20];
        sprintf(msgname, "msg-%d", getIndex());
        cMessage *msg = new cMessage(msgname);
        scheduleAt(0.0, msg);
    }
}

void computer::handleMessage(cMessage *msg)
{
    if (getIndex() == 24) {

            EV << "Message " << msg << " arrived.\n";
            delete msg;
        }
        else {

            forwardMessage(msg);
        }
    }

void computer::forwardMessage(cMessage *msg)
{

    int n = gateSize("gate");
    int k = intuniform(0, n-1);

    EV << "Forwarding message " << msg << " on gate[" << k << "]\n";
    send(msg, "gate$o", k);
}

模拟快照:https://i.stack.imgur.com/a4JRQ.png

【问题讨论】:

  • 你能把图片粘贴到你的问题中吗?

标签: c++ broadcast omnet++


【解决方案1】:

您使用getIndex() 方法返回模块在模块数组中的位置。但是,模拟快照显示您不使用模块数组。因此getIndex() 为每个模块返回零。

纠正模型的最简单方法是检查模块的名称而不是其位置,例如:

void computer::initialize()
{
   // if (getIndex() == 0) {
   if (isName("computer0")) {
        char msgname[20];
   // ...


void computer::handleMessage(cMessage *msg)
{
   // if (getIndex() == 24) {
   if (isName("computer24")) {
        EV << "Message " << msg << " arrived.\n";
   // ...

【讨论】:

  • 非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
相关资源
最近更新 更多