나는 pcap_next_ex로 패킷을 캡쳐하는 루프를 가지고 있으며, 각 iteraction에서 패킷 처리에 따라 많은 함수 호출을한다. 이 물건은 루프에서 Sleep() 호출로 시뮬레이션 할 수 있습니다. 그러면 pcap_next_ex() 루프에서 Sleep을 호출하면 어떻게됩니까? 내가 pcap_next_ex를 사용하고 나중에 다른 스레드를 처리하는 벡터에서 패킷을 저장 코드를 보았다Winpcap 코드 - 캡쳐가 루프에서 패킷을 잃는다.
pcap_pkthdr* header = NULL;
UCHAR* content = NULL;
pcap = pcap_open(adapterName.c_str(), 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, NULL);
//Set to nonblock mode?
while (INT res = pcap_next_ex(pcap, &header, const_cast<const UCHAR**>(&content)) >= 0)
{
if (res != FALSE)
{
if (content)
{
//Here i do the stuff which I will simulate with a Sleep() call
Sleep(200);
}
}
}
,이 방법은 특히 물건의 시간을 줄일 수 있지만, 나에게 많은 설득하지 않습니다. 이 방법을 사용해야합니까?
"비 차단"모드에서 패킷을 캡처하고 오는 각 패킷에 대해 이벤트를 호출하는 다른 winpcap 기능을 사용하고 싶습니다 ... winpcap을 사용하여 패킷을 손실하지 않는 가장 좋은 방법은 무엇입니까?
도움이 될 것입니다. 문안 인사.
답장을 보내 주셔서 감사합니다. "pcap_loop"또는 "pcap_dispatch"에 대해 어떻게 생각하십니까? 문제를 해결할 수 있습니까? 그렇지 않으면 "pcap_next_ex"를 더 자주 호출해야하거나 다른 스레드를 만들어 패킷을 처리해야한다고 말합니다. – KaxperdayTrolling
WinPcap의 소스에 관해서는'pcap_loop' (또는'pcap_dispatch')에 전달 된 콜백이'pcap_loop'을 호출 한 동일한 스레드에서 호출됩니다. 즉'pcap_loop'에 대한 전용 스레드가 여전히 필요합니다. 가능한 한 빨리 링 버퍼를 읽는 작업으로 돌아갈 수 있습니다. – kaitoy