【问题标题】:Omnet++ : How to sent to multiple hosts in inetOmnet++:如何在inet中发送到多个主机
【发布时间】:2017-01-19 12:00:00
【问题描述】:

如果我想让一个主机发送给多个主机但不是全部。

**.Host1.app1.destAddress = "6e:27:f5:71:ab:11"  
**.Host1.app2.destAddress = "6e:27:f5:71:ac:12"  
**.Host1.app3.destAddress = "6e:27:f5:71:ad:13"

我正在尝试通过如下编辑应用程序模块来解决问题

代码是

//omnetpp.ini    
**.Host1.app.destAddress = "6e:27:f5:71:ab:11"

void EtherTrafGen::handleMessage(cMessage *msg)
{
if (!isNodeUp())
        throw cRuntimeError("Application is not running");
    if (msg->isSelfMessage())
    {
       if (msg->getKind() == START)
         {
            destMACAddress = resolveDestMACAddress();
            if (destMACAddress.isUnspecified())
            return;
          }
        sendBurstPackets();
        scheduleNextPacket(simTime());
        }
    }
    else
        receivePacket(check_and_cast<cPacket *>(msg));
    }
}

MACAddress EtherTrafGen::resolveDestMACAddress()
{
    MACAddress destMACAddress;
    destAddress = par("destAddress");
    if (destAddress[0]) {
        if (!destMACAddress.tryParse(destAddress)) {
            cModule *destStation = getModuleByPath(destAddress);
            if (!destStation)
                throw cRuntimeError("...");
            cModule *destMAC = destStation->getSubmodule("mac");
            if (!destMAC)
                throw cRuntimeError("...", destAddress);
            destMACAddress.setAddress(destMAC->par("address"));
        }
    }
    return destMACAddress;
}

我所做的更改如下

//omnetpp.ini
**.Host1.app.destAddresses = "6e:27:f5:71:ab:11,6e:27:f5:71:ac:12,6e:27:f5:71:ad:13"

class INET_API EtherTrafGen : public cSimpleModule, public ILifecycle
{
  public:
    const char *destAddress;
    bool multipacket;
    std::vector<std::string> v;
    unsigned int x;
}

void EtherTrafGen::handleMessage(cMessage *msg)
{
    multipacket = true;
    if (!isNodeUp())
        throw cRuntimeError("Application is not running");
    if (msg->isSelfMessage())
    {
        const char *destAddresses = par("destAddresses");
        if(multipacket)
        {
            std::vector<std::string> v = cStringTokenizer(destAddresses).asVector();
            for (x = 0; x <= v.size(); x++)
            {
                if (msg->getKind() == START)
                        {
                            destMACAddress = resolveDestMACAddress();
                            // if no dest address given, nothing to do
                            if (destMACAddress.isUnspecified())
                                return;
                        }
                        sendBurstPackets();
                        scheduleNextPacket(simTime());
            }
        }

        else if(!(multipacket))
        {
            if (msg->getKind() == START)
                    {
                        destMACAddress = resolveDestMACAddress();
                        // if no dest address given, nothing to do
                        if (destMACAddress.isUnspecified())
                            return;
                    }
                    sendBurstPackets();
                    scheduleNextPacket(simTime());
        }
    }
    else
        receivePacket(check_and_cast<cPacket *>(msg));
}

MACAddress EtherTrafGen::resolveDestMACAddress()
{
    MACAddress destMACAddress;

    if (multipacket)
    {destAddress = v[x].c_str();}
    else if (!multipacket)
    { destAddress = par("destAddress");}

    if (destAddress[0]) {
        if (!destMACAddress.tryParse(destAddress)) {
            cModule *destStation = getModuleByPath(destAddress);
            if (!destStation)
                throw cRuntimeError("...");

            cModule *destMAC = destStation->getSubmodule("mac");
            if (!destMAC)
                throw cRuntimeError("...", destAddress);
            destMACAddress.setAddress(destMAC->par("address"));
        }
    }
    return destMACAddress;
}

结果是,如果 bool multiaddress 为 false 则它工作正常,但如果它为 true 但也没有错误,则它不起作用。就好像它被一个空地址覆盖一样。

“我很抱歉代码太长,但我害怕错过可能与我正在做的事情有关的功能,我没有注意到”

【问题讨论】:

    标签: omnet++ inet


    【解决方案1】:

    您在destAddresses 中使用逗号作为分隔符,而在cStringTokenizer 中空格(即空格、制表符、CR、LF)是默认分隔符。 因此,您应该通过更改行来通知 cStringTokenizer 的解析器逗号是分隔符:

    std::vector<std::string> v = cStringTokenizer(destAddresses).asVector();
    

    进入:

    v = cStringTokenizer(destAddresses, ",").asVector();
    

    v 的声明已被省略,因为您可能打算在您的类中使用 v(在 C++ 中,任何局部变量都将覆盖类中同名的变量)。

    【讨论】:

    • 注意到其他小错误并进行了更改,但在每条消息开始发送第二条消息后取消计划仍然存在问题。这是在事件 #1,t=1 时出现 模块 (inet::EtherTrafGen) Mysimulation.Host1.app (id=44) 中的错误: )generateNextPacket 当前已调度,重新调度前使用cancelEvent()。
    • EtherTrafGen::scheduleNextPacket 有关
    • 我已经编辑了我的答案 - 您必须从您的方法中删除 v 的声明。您没有提供generateNextPacketscheduleNextPacket 的代码,因此很难为您提供帮助。此外,我强烈建议在 resolveDestMACAddress() 中添加一个参数,而不是使用类中的字段 - 迟早会导致错误。
    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 2021-11-23
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多