2016-12-16 67 views
0

我有一個循環捕獲數據包與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數據包?

任何幫助將不勝感激。問候。

回答

1

WinPcap將捕獲的數據包存儲到一個大小受限的環形緩衝區中。 如果數據包的字節數達到環形緩衝區大小,則丟棄舊數據包,以便WinPcap可以存儲新數據包。

因此,您應該儘可能頻繁地撥打pcap_next_ex,以便在丟棄之前儘可能多地獲取數據包。

在專用線程中調用pcap_next_ex並在另一個線程中處理數據包是一種很好的做法,因爲這種方式可以最頻繁地調用pcap_next_ex

+0

感謝您的回答,我想知道您對「pcap_loop」或「pcap_dispatch」有什麼看法。他們能解決問題嗎?否則,正如你所說,我必須更頻繁地調用「pcap_next_ex」或創建其他線程來處理數據包。 – KaxperdayTrolling

+0

至於我看到WinPcap的來源,傳遞給'pcap_loop'(或'pcap_dispatch')的回調在調用'pcap_loop'的同一線程中調用,這意味着您仍然需要一個專用線程來處理'pcap_loop'它可以返回工作,儘快讀取環形緩衝區。 – kaitoy