我看到了這樣的一個項目中使用的代碼:使用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的正確方法是什麼?
好,我沒有發現有在0.98中的錯誤(但看起來它不是一個正式的版本?下載表格http://public.lanl.gov/cpw/)的FUNC 'pcap_next'或'pcap_next_ex'不正確,它在返回用戶應用程序之前沒有將數據包複製到安全的存儲位置。 – jon 2010-10-21 07:56:56
有趣。在我自己用pcap_next進行的測試中,我注意到了相同的結果,因爲我的TCP窗口大小越來越小,直到達到零。該函數沒有正確清空接收緩衝區,我不得不重寫使用recv()而不是漂亮的pcap實用程序。我不能評論這個特定的補丁,但切換到select()/ recv()爲我的問題工作。 – Shawn 2010-10-21 13:46:40