为什么pcap_next_ex在Window上不断返回0

Why pcap_next_ex keeps returning 0 on Window?

本文关键字:返回 pcap next ex 为什么 Window      更新时间:2023-10-16

我使用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 %dn", rc);
            return -1;
        }
    }
}

我发现函数不工作的原因是轮询函数太慢。现在我只在阅读阶段使用了一个线程,这个问题已经不存在了。