我已将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
块内的行。
答案 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());
}
}