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

时间:2016-03-12 09:58:47

标签: omnet++

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

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块内的行。

1 个答案:

答案 0 :(得分:3)

您接收到的帧数为decapsulating两次。

check_for_validity()条件通过时,if的函数调用和if块内的另一个函数调用。因此当您再次尝试if时,在decapsulate()块内,然后返回null指针。因此,当您尝试访问此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());
    } 
}