使用pcap_next_ex或pcap_next(libpcap)的正确方法

时间:2010-10-15 03:32:34

标签: 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的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

我在使用winpcapy(1.9.2009)和WinPcap 4.1.0.2001的python中解决了这个问题。

我只是通过创建数据包数据的副本来解决它(正如所提到的memcpy所建议的那样)。

pkt_data = pkt_data[:header.contents.len]

不确定它是否正确但目前对我有效。

根据winpcap papermail的答案,pkt_data引用的内容应该持续到下一次调用pcap_next_ex(或其他调度方法)。如果我做对了,因为它使用一个缓冲区来获取更多/所有数据包,所以它可以重用于其他/最后一个数据包?

Q值。

答案 1 :(得分:-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


}