cPacket 在 OMNet++ 中导致模拟崩溃

cPacket causing simulation crash in OMNet++

我已将 2 个 cPackets 消息文件定义为:

packet MyLinkFrame {
    int f1;
    int f2;
}

packet IPv4ARPTotf {
    string SourceIP;
    string DestinationIP;
}

然后在我的模拟中,一个网络节点接收到链路层帧 MyLinkFrame 被接收,它封装了 IPv4ARPTotf

然后,在接收网络节点上,我创建一个新的 IPv4ARPTotf 类型的 ARP 回复数据包,如下所示:

if(check_for_validity(static_cast<IPv4ARPTotf *>(MyLinkFrame->decapsulate())))
{ 
    if (MyLinkFrame->getFrameType() == 0) {
       tempIPARPRequest = static_cast<IPv4ARPTotf *>(MyLinkFrame->decapsulate());
       tempIPARPReply = new IPv4ARPTotf("IPv4ARPReply");
       tempIPARPReply->setSourceIP(tempIPARPRequest->getDestinationIP());
       tempIPARPReply->setDestinationIP(tempIPARPRequest->getSourceIP());
    } 
} 

现在内部 if 块内的行崩溃。

你是decapsulating两次收到的帧。

一次在 check_for_validity() 的函数调用中,另一个在 if 块内,只要 if 条件通过。因此,在 if 块中,当您再次尝试 decapsulate() 时,会返回一个 null 指针。因此,当您尝试访问此空对象的参数 tempIPARPRequest->getDestinationIP() 时,您会遇到异常并且您的模拟会崩溃。

一个简单的解决方法是将重复的对象传递给您的 check_for_validity() 函数,并可选择删除该函数中重复的 msg

您提供的代码的示例修改:

if(check_for_validity(static_cast<IPv4ARPTotf *>(MyLinkFrame->dup()->decapsulate())))
{ 
    if (MyLinkFrame->getFrameType() == 0) {
       tempIPARPRequest = static_cast<IPv4ARPTotf *>(MyLinkFrame->decapsulate());
       tempIPARPReply = new IPv4ARPTotf("IPv4ARPReply");
       tempIPARPReply->setSourceIP(tempIPARPRequest->getDestinationIP());
       tempIPARPReply->setDestinationIP(tempIPARPRequest->getSourceIP());
    } 
}