为什么 pcap_next_ex 在 Window 上一直返回 0?
Why pcap_next_ex keeps returning 0 on Window?
我正在使用 winpcap 实现嗅探器,我不断轮询以下 readpacket 函数,但随机(有时在 1 分钟后,有时在 5 小时后)我的程序卡在这个过程中,因为 rc 一直等于 0 . 为什么会这样?我错过了什么?
相关配置:
pcap_set_snaplen (_pPCapHandle, 65535);
pcap_set_promisc (_pPCapHandle, 1);
pcap_set_timeout (_pPCapHandle, msPacketValid); //msPacketValid = 0
int PCapInterface::readPacket (uint8 *pui8Buf, uint16 ui16BufSize)
{
struct pcap_pkthdr *pPacketHeader;
const u_char *pPacketData;
while (true) {
int rc = pcap_next_ex (_pPCapHandle, &pPacketHeader, &pPacketData);
if (rc > 0) {
uint32 ui32PacketSize = ui16BufSize < pPacketHeader->caplen ? ui16BufSize : pPacketHeader->caplen;
memcpy (pui8Buf, pPacketData, ui32PacketSize);
return ui32PacketSize;
}
else if (rc == 0) {
printf("read rc = 0...\n");
if (_bIsTerminationRequested) {
return 0;
}
}
else if (rc < 0)
{
checkAndLogMsg ("PCapInterface::readPacket", Logger::L_MildError, "pcap_next_ex() returned %d\n", rc);
return -1;
}
}
}
我发现这个功能不起作用的原因是因为轮询功能太慢了。现在我只在阅读阶段使用一个线程,问题就不再存在了。
我正在使用 winpcap 实现嗅探器,我不断轮询以下 readpacket 函数,但随机(有时在 1 分钟后,有时在 5 小时后)我的程序卡在这个过程中,因为 rc 一直等于 0 . 为什么会这样?我错过了什么?
相关配置:
pcap_set_snaplen (_pPCapHandle, 65535);
pcap_set_promisc (_pPCapHandle, 1);
pcap_set_timeout (_pPCapHandle, msPacketValid); //msPacketValid = 0
int PCapInterface::readPacket (uint8 *pui8Buf, uint16 ui16BufSize)
{
struct pcap_pkthdr *pPacketHeader;
const u_char *pPacketData;
while (true) {
int rc = pcap_next_ex (_pPCapHandle, &pPacketHeader, &pPacketData);
if (rc > 0) {
uint32 ui32PacketSize = ui16BufSize < pPacketHeader->caplen ? ui16BufSize : pPacketHeader->caplen;
memcpy (pui8Buf, pPacketData, ui32PacketSize);
return ui32PacketSize;
}
else if (rc == 0) {
printf("read rc = 0...\n");
if (_bIsTerminationRequested) {
return 0;
}
}
else if (rc < 0)
{
checkAndLogMsg ("PCapInterface::readPacket", Logger::L_MildError, "pcap_next_ex() returned %d\n", rc);
return -1;
}
}
}
我发现这个功能不起作用的原因是因为轮询功能太慢了。现在我只在阅读阶段使用一个线程,问题就不再存在了。