我有一個循環捕獲數據包與pcap_next_ex並在每次迭代中,我根據處理數據包做了很多函數調用。這些東西可以通過循環中的Sleep()調用來模擬。然後發生什麼,然後我在pcap_next_ex()循環中調用Sleep ?.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);
}
}
}
我已經看到它使用pcap_next_ex和保存數據包的載體後來與另一個線程來對待他們的代碼,這種方法主要是減少了的東西的時候,但不會說服了我很多。我可以用這個方法嗎?
我想使用其他winpcap函數捕獲在「非阻塞」模式下的數據包,並調用每個數據包的事件來...什麼是最好的方法,不丟失與winpcap數據包?
任何幫助將不勝感激。問候。
感謝您的回答,我想知道您對「pcap_loop」或「pcap_dispatch」有什麼看法。他們能解決問題嗎?否則,正如你所說,我必須更頻繁地調用「pcap_next_ex」或創建其他線程來處理數據包。 – KaxperdayTrolling
至於我看到WinPcap的來源,傳遞給'pcap_loop'(或'pcap_dispatch')的回調在調用'pcap_loop'的同一線程中調用,這意味着您仍然需要一個專用線程來處理'pcap_loop'它可以返回工作,儘快讀取環形緩衝區。 – kaitoy