(OMNeT++) 找不到序列化程序

问题描述

使用 OMNeT++ 我修改了 UdpBasicApp.cc 文件添加了以下代码

cModule *mod = getModuleByPath("^.ppp[0].ppp.queue");                 
queueing::PacketQueue *queue = check_and_cast<queueing::PacketQueue*>(mod);
int e = queue->getNumPackets();                                                
int f = queue->getMaxnumPackets();                                          

simtime_t queueRetrieveTime = simTime();

Packet *queueRetrieve = new Packet("Queue_Info");
if(dontFragment)
    queueRetrieve->addTag<FragmentationReq>()->setDontFragment(true);
const auto& payload1 = makeShared<QueueInfoMessage>();
payload1->setChunkLength(B(1000));
payload1->setQueueLength(e);
payload1->setQueueMaxLength(f);
payload1->setTimeOfRetrieve(queueRetrieveTime);
payload1->addTag<CreationTiMetag>()->setCreationTime(simTime());
queueRetrieve->insertAtBack(payload1);
L3Address destAddr1 = chooseDestAddr();
socket.sendTo(queueRetrieve,destAddr1,destPort);

我从 UdpBasicApp.cc 中的 handleMessage() 函数中复制了它,并将它放在已经提到的函数的开头,在其他一切之前。

我尝试发送的消息是我自己创建的消息,QueueInfoMessage.msg 文件是这样的:

import inet.common.INETDefs;
import inet.common.packet.chunk.Chunk;
namespace inet;

cplusplus {{
    const B YOUR_APP_HEADER_LENGTH = B(6);
}}

class QueueInfoMessage extends FieldsChunk
{
    chunkLength = YOUR_APP_HEADER_LENGTH;
    int queueLength;
    int queueMaxLength;
    simtime_t timeOfRetrieve;
    uint32_t sequenceNumber;
}

正如我从这个主题 here 中了解到的那样。

运行模拟时出现此错误

Cannot find serializer for inet::QueueInfoMessage in module (inet::Ipv4) Network.router3.ipv4.ip (id=...),...

我创建的消息是从标准消息 ApplicationPacket.msg(在文件的同一个 handleMessage() 函数中使用)复制的,以确保没有错误,并且我添加了一些额外的变量来执行我想要的操作要做

为什么会出现这个错误? (顺便说一句,我不知道序列化程序是什么或做什么)

更新:

问题源于在激活 pcapRecorder 的情况下对 ned 文件中的链接使用不当:出现错误是因为我在具有不同类型链接的节点中设置了 pcapRecorder。解决方案可能是更改节点的所有链接并仅使用一种类型的链接(以太网、ppp 等)。另一种解决方案是停用节点中的 pcapRecorder。其他解决方案可能包括(我猜)设置更多 pcapRecorder,以某种方式将它们中的每一个链接一个门,并设置许多 pcapLinkType 参数以匹配每个门的链接类型。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)