2010-10-15 45 views
4

我看到了這樣的一個項目中使用的代碼:使用pcap_next_ex或pcap_next(libpcap的)正確的方式

while (1) 
{ 
    l_numPkts = pcap_next_ex(m_pcapHandle, &header, &pkt_data); 
    //do something 
    memcpy(dst,pkt_data,size);  
} 

的pcap_next_ex回報,包狀態將被設置TP_STATUS_KERNEL之後,這意味着BUF是返回內核。 代碼:

/* next packet */ 
switch (handle->md.tp_version) { 
    case TPACKET_V1: 
    h.h1->tp_status = TP_STATUS_KERNEL; 
.. 
在一些高速環境

,它會得到一個內存不足的問題?

以及使用pcap_next/pcap_next_ex的正確方法是什麼?

回答

-3

有很多工作pcap示例在線和有用的手冊頁的例子。 試試這裏:TCPDUMP.org 我們需要更多的代碼來回答你的問題。

+0

好,我沒有發現有在0.98中的錯誤(但看起來它不是一個正式的版本?下載表格http://public.lanl.gov/cpw/)的FUNC 'pcap_next'或'pcap_next_ex'不正確,它在返回用戶應用程序之前沒有將數據包複製到安全的存儲位置。 – jon 2010-10-21 07:56:56

+0

有趣。在我自己用pcap_next進行的測試中,我注意到了相同的結果,因爲我的TCP窗口大小越來越小,直到達到零。該函數沒有正確清空接收緩衝區,我不得不重寫使用recv()而不是漂亮的pcap實用程序。我不能評論這個特定的補丁,但切換到select()/ recv()爲我的問題工作。 – Shawn 2010-10-21 13:46:40

1

我在python中使用winpcapy(1.9.2009)和WinPcap 4.1.0.2001凍結了這個問題。

我簡單地通過創建分組數據數組的副本來解決它(正如問題中提到的memcpy所建議的那樣)。

pkt_data = pkt_data[:header.contents.len]

不知道這是否是正確的,但此刻對我的作品。

並且根據winpcap papermail的回答,pkt_data引用的內容應該持續到下一次pcap_next_ex(或其他調度方法)的調用。如果我說得對,因爲它爲一個或多個數據包使用了一個緩衝區,因此它可以用於其他/最後一個數據包?

Q.

-1
char errbuff[10000]; 
pcap_t * handler = pcap_open_offline(argv[1], errbuff); 
struct pcap_pkthdr *header; 
u_char *packet; 
while (pcap_next_ex(handler, &header, &packet) >= 0) 
{ 
    printf("len %d:\n",header->len); 
    ... YOUR CODE 


}