我看到了这样的一个项目中使用的代码:使用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