我正在使用Visual Studio 2017和PcapPlusPlus。我希望我的应用程序打印HTTP数据包的特定标头(例如,用户代理),然后丢弃具有特定值的软件包(但我没有达到丢弃的目的)当我编译我的代码时,它工作正常,但是当我向某个站点发出请求时,它会打印例如“ user-agent what”,然后对我抛出异常:读取访问冲突。 **这*是0x58。我是C ++和Visual Studio的新手,所以我不知道该异常是什么意思。如何解决此问题?这是我的代码:
#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();
}
答案 0 :(得分:1)
我没有以这种身份使用C ++,但是我有一些想法。首先,您遇到“读取访问冲突”。我会考虑读取无效的内存。其次,它告诉您“ this”指针为0x58。这是一个非常低的数字,接近0x0。您很可能会找回一个空指针,并在其他地方使用它。
可能是httpRequestLayer或消耗包装中调用链中的其他内容返回空吗?