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());
}
}
我已将 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());
}
}