Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;引发异常:读取访问冲突_C++ - Fatal编程技术网

C++ C++;引发异常:读取访问冲突

C++ C++;引发异常:读取访问冲突,c++,C++,我正在使用Visual Studio 2017和PcapPlusPlus。我希望我的应用程序打印http数据包的特定头(例如用户代理),然后删除具有特定值的数据包(但我还没有到达删除部分)。当我编译代码时,它可以正常工作,但当我向某个站点发出请求时,它会打印出例如“用户代理”之类的内容然后向我抛出一个异常:读取访问冲突。 **这是0x58。我是C++和VisualStudio的新手,所以我不知道那个异常是什么意思。我怎么解决这个问题?这里是我的代码: #include "stdlib.h" #i

我正在使用Visual Studio 2017和PcapPlusPlus。我希望我的应用程序打印http数据包的特定头(例如用户代理),然后删除具有特定值的数据包(但我还没有到达删除部分)。当我编译代码时,它可以正常工作,但当我向某个站点发出请求时,它会打印出例如“用户代理”之类的内容然后向我抛出一个异常:读取访问冲突。 **这是0x58。我是C++和VisualStudio的新手,所以我不知道那个异常是什么意思。我怎么解决这个问题?这里是我的代码:

#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中调用链中的其他内容返回空值?

调试器告诉您什么?我建议您查看。。。