4

我在一个项目中看到了这种代码:

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

4

2 回答 2

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 (或其他调度方法)如果我做对了,因为它对更多/所有数据包使用一个缓冲区,因此它可以用于其他/最后一个数据包?

问。

于 2011-04-05T10:11:30.547 回答
-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


}
于 2015-04-20T07:47:45.683 回答