2010-10-15 1479 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 


}