Ошибка check_and_cast () для inet :: Indication * в OMNeT ++ - PullRequest
0 голосов
/ 10 июля 2020

Я моделирую сеть в Omnet ++ с помощью структуры INET и получаю следующую ошибку:

check_and_cast (): Невозможно преобразовать (inet :: Indication *) к типу 'inet :: Packet *' - в модуле> (inet :: DFNodeUDP) UDPnetworksim.DF2.app [0] (id = 232), в t = 300 с, событие #

Это часть моего кода, которая имеет дело с check_and_cast ():

void DFNodeUDP::handleMessageWhenUp(cMessage *msg)
{

    if (msg->getKind() == msg_kind::STOP_UDP) {
        socket.destroy();
        UdpControl::getInstance().decrementNumSockets();
        if (selfMsg->isSelfMessage()) {
            cancelEvent(selfMsg);
        }
        delete msg;
        msg = nullptr;
        return;
    }

    if (msg->getKind() == msg_kind::RESTART_UDP) {
       socket.setOutputGate(gate("socketOut"));
       int localPort = par("localPort");
       const char *localAddress = par("localAddress");
       socket.bind(*localAddress ? L3AddressResolver().resolve(localAddress) : L3Address(), localPort);
       MulticastGroupList mgl = getModuleFromPar<IInterfaceTable>(par("interfaceTableModule"), this)->collectMulticastGroups();
       socket.joinLocalMulticastGroups(mgl);
       socket.setCallback(this);

       UdpControl::getInstance().addSocket(getParentModule()->getName(), socket.getSocketId());

       selfMsg = new cMessage("restart", START);
       scheduleAt(simTime(), selfMsg);
       delete msg;
       msg = nullptr;
       return;
    }

    if (ExperimentControlUDP::getInstance().getState() == 1) {
        if (msg->getKind() == msg_kind::INIT_TIMER) {
            // Schedule next INIT_TIMER
            scheduleAt(simTime() + frequency, msg);

            // Schedule message to be finally sent after propagation delay
            EV_INFO << "delayedMsgSend " << getParentModule()->getName() << endl;
            delayedMsgSend();
        } else if (msg->getKind() == msg_kind::APP_SELF_MSG) {
            delete msg;
            msg = nullptr;
            EV_INFO << "finalMsgSend " << getParentModule()->getName() << endl;
            finalMsgSendRouter();
        } else if (find(destAddressStr.begin(), destAddressStr.end(), msg->getSenderModule()->getParentModule()->getName()) != destAddressStr.end()) {
            string destination = ExperimentControlUDP::getInstance().getMasterRoute(msg->getKind())[1];
            destination = "UDPnetworksim." + destination + ".app[0]";
            cModule *targetModule = getModuleByPath(destination.c_str());
            sendDirect(msg, targetModule, "appIn");
        } else if (msg->getKind() == msg_kind::APP_MSG_SENT) {
//            Packet *packet = check_and_cast<Packet *>(msg);
//            saveData(packet);
            delete msg;
        } else {
            EV_INFO << "msg->getKind() == " << msg->getKind() << endl;
            delete msg;
            msg = nullptr;
        }
    } else if (msg->isSelfMessage()) {
        if (msg->getKind() == msg_kind::INIT_TIMER) {
            delete msg;
        } else if (msg->getKind() == msg_kind::DELAY) {
            delete msg;
            Packet *packet = new Packet("to SN");
            if(dontFragment)
               packet->addTagIfAbsent<FragmentationReq>()->setDontFragment(true);
            const auto& payload = makeShared<ApplicationPacket>();
            payload->setChunkLength(B(par("messageLength")));;
            payload->addTag<CreationTimeTag>()->setCreationTime(simTime());
            packet->insertAtBack(payload);
            L3Address destAddr = chooseDestAddr(-1, ExperimentControlUDP::getInstance().IDmap[id]);
            socket.sendTo(packet, destAddr, 2000);
        } else {
            ASSERT(msg == selfMsg);
            switch (selfMsg->getKind()) {
                case START:
                    processStart();
                    break;

                case SEND:
                    processSend();
                    break;

                case STOP:
                    processStop();
                    break;

                default:
                    throw cRuntimeError("Invalid kind %d in self message", (int)selfMsg->getKind());
            }
        }
    } else {
        ASSERT(msg->getKind() != msg_kind::DELAY);
        if (msg->getKind() == L4_msg::UPSTREAM) {
            Packet *pk = check_and_cast<Packet *>(msg);
            saveData(pk);
        } else {
            socket.processMessage(msg);
        }
    }
}

Опять же, это происходит почти в конец моделирования, и до этого все шло гладко.

1 Ответ

0 голосов
/ 11 июля 2020

Похоже, вы используете INET. Ваша ошибка может быть вызвана неправильным использованием метода из INET. Чтобы найти инструкцию, которая вызывает ошибку в вашем omnetpp.ini наборе:

debug-on-errors = true

Затем запустите симуляцию в режиме отладки. Выполнение симуляции остановится непосредственно перед инструкцией, которая вызывает ошибку.

Ссылка: Запуск симуляции - Отладка

...