C++ C++;引发异常:读取访问冲突
我正在使用Visual Studio 2017和PcapPlusPlus。我希望我的应用程序打印http数据包的特定头(例如用户代理),然后删除具有特定值的数据包(但我还没有到达删除部分)。当我编译代码时,它可以正常工作,但当我向某个站点发出请求时,它会打印出例如“用户代理”之类的内容然后向我抛出一个异常:读取访问冲突。 **这是0x58。我是C++和VisualStudio的新手,所以我不知道那个异常是什么意思。我怎么解决这个问题?这里是我的代码:C++ C++;引发异常:读取访问冲突,c++,C++,我正在使用Visual Studio 2017和PcapPlusPlus。我希望我的应用程序打印http数据包的特定头(例如用户代理),然后删除具有特定值的数据包(但我还没有到达删除部分)。当我编译代码时,它可以正常工作,但当我向某个站点发出请求时,它会打印出例如“用户代理”之类的内容然后向我抛出一个异常:读取访问冲突。 **这是0x58。我是C++和VisualStudio的新手,所以我不知道那个异常是什么意思。我怎么解决这个问题?这里是我的代码: #include "stdlib.h" #i
#include "stdlib.h"
#include "PcapLiveDeviceList.h"
#include "PlatformSpecificUtils.h"
#include "Packet.h"
#include "TcpLayer.h"
#include "HttpLayer.h"
struct PacketStats
{
void consumePacket(pcpp::Packet& packet)
{
pcpp::HttpRequestLayer* httpRequestLayer = packet.getLayerOfType<pcpp::HttpRequestLayer>();
if (packet.isPacketOfType(pcpp::HTTP))
printf("HTTP,%s\n",httpRequestLayer->getFieldByName(PCPP_HTTP_USER_AGENT_FIELD)->getFieldValue().c_str());
}
};
static void onPacketArrives(pcpp::RawPacket* packet, pcpp::PcapLiveDevice* dev, void* cookie)
{
PacketStats* stats = (PacketStats*)cookie;
pcpp::Packet parsedPacket(packet);
stats->consumePacket(parsedPacket);
}
int main(int argc, char* argv[])
{
std::string interfaceIPAddr = "192.168.0.249";
pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getPcapLiveDeviceByIp(interfaceIPAddr.c_str());
if (dev == NULL)
{
printf("Cannot find interface with IPv4 address of '%s'\n", interfaceIPAddr.c_str());
exit(1);
}
if (!dev->open())
{
printf("Cannot open device\n");
exit(1);
}
PacketStats stats;
pcpp::PortFilter portFilter(80, pcpp::SRC_OR_DST);
pcpp::ProtoFilter protocolFilter(pcpp::TCP);
pcpp::AndFilter andFilter;
andFilter.addFilter(&portFilter);
andFilter.addFilter(&protocolFilter);
dev->setFilter(andFilter);
printf("\nStarting packet capture with a filter in place...\n");
dev->startCapture(onPacketArrives, &stats);
PCAP_SLEEP(10);
dev->stopCapture();
dev->close();
}
#包括“stdlib.h”
#包括“PcapLiveDeviceList.h”
#包括“platformspecificitils.h”
#包括“Packet.h”
#包括“TcpLayer.h”
#包括“HttpLayer.h”
结构PacketStats
{
无效数据包(pcpp::数据包和数据包)
{
pcpp::HttpRequestLayer*HttpRequestLayer=packet.getLayerOfType();
if(packet.isPacketOfType(pcpp::HTTP))
printf(“HTTP,%s\n”,httpRequestLayer->getFieldByName(PCPP_HTTP_USER_AGENT_FIELD)->getFieldValue().c_str());
}
};
静态void onPacketArrives(pcpp::RawPacket*packet,pcpp::PcapLiveDevice*dev,void*cookie)
{
PacketStats*stats=(PacketStats*)cookie;
pcpp::包解析包(Packet);
统计->消费数据包(解析数据包);
}
int main(int argc,char*argv[])
{
std::字符串接口paddr=“192.168.0.249”;
pcpp::PcapLiveDevice*dev=pcpp::PcapLiveDeviceList::getInstance().getPcapLiveDeviceByIp(interfacePaddr.c_str());
如果(dev==NULL)
{
printf(“找不到IPv4地址为“%s”的接口,interfaceIPAddr.c_str());
出口(1);
}
如果(!dev->open())
{
printf(“无法打开设备\n”);
出口(1);
}
PacketStats;
pcpp::PortFilter PortFilter(80,pcpp::SRC_或DST);
pcpp::ProtoFilter protocolFilter(pcpp::TCP);
pcpp::AND过滤器和过滤器;
andFilter.addFilter(&portFilter);
andFilter.addFilter(&protocolFilter);
dev->setFilter(andFilter);
printf(“\n使用过滤器开始数据包捕获…\n”);
开发->开始许可(关于包装和统计);
PCAP_睡眠(10);
dev->stopCapture();
dev->close();
}
<>代码>我没有用C++来处理这个问题,但是我有一些想法。首先,您会遇到“读取访问冲突”。我想读的是无效的记忆。其次,它告诉您“this”指针是0x58。这是一个非常低的数字,接近0x0。很可能您正在返回一个空指针,并在其他地方使用它
是httpRequestLayer还是ConsumerPacket中调用链中的其他内容返回空值?调试器告诉您什么?我建议您查看。。。