我在项目中看到了这种代码:
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 的正确方法是什么?
最佳答案
我在 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 (或其他调度方法)为止。如果我做对了,因为它使用一个缓冲区来存储更多/所有数据包,所以它可以重用于其他/最后一个数据包?
问。
关于libpcap - 使用 pcap_next_ex 或 pcap_next (libpcap) 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3939314/