【问题标题】:How can I get if a ringbuffer of the libpcap is going to full如果 libpcap 的环形缓冲区快满了,我怎么能得到
【发布时间】:2019-07-31 07:29:50
【问题描述】:

我在我的项目中使用 libpcap 并使用函数 pcap_set_buffer_size() 来设置初始值。当环形缓冲区已满时,libpacp 统计数据显示大量数据包被丢弃。

如何获取有关环形缓冲区可用空间的信息?

【问题讨论】:

  • 你就不能通过二分法找到合适的尺寸吗?
  • 我需要在每次调用 pcap_dispatch() 方法之前获取环形缓冲区的可用空间。谢谢你的提问。
  • 你读过this吗?希望这会有所帮助
  • 为什么要在pcap_dispatch()之前获取ringbuf的可用空间大小?
  • When reading packets from an interface opened for a live capture, pcap_dispatch(), pcap_next(), and pcap_next_ex() will, if no packets are currently available to be read, block waiting for packets to become available

标签: c++ c networking pcap libpcap


【解决方案1】:

来自man pcap

尺寸太小可能意味着,如果有太多的数据包正在 捕获并且快照长度不限制数据量 这是缓冲的,如果缓冲区填满,数据包可能会被丢弃 在应用程序可以从中读取数据包之前,而大小 太大可能会使用更多的不可分页操作系统内存 有必要防止数据包被丢弃

缓冲区的理想大小取决于用例。

您可以通过使用二分法来找到这个理想尺寸:

  • 首先设置一个巨大但系统支持的大小
  • 使用 pcap_stats() 获取丢弃数据包的数量
  • 再次编译并运行。
  • 请注意您是否丢弃了数据包。


  • 然后设置为您当前的大小

  • 使用 pcap_stats() 获取丢弃数据包的数量
  • 再次编译并运行。
  • 请注意您是否丢弃了数据包。


  • 然后将尺寸设置为(巨大尺寸+当前尺寸)/2

  • 使用 pcap_stats() 获取丢弃数据包的数量
  • 再次编译并运行。
  • 请注意您是否丢弃了数据包。


  • ...

请注意,您可以通过使用pcap_set_snaplen() 设置快照长度来减少缓冲区使用量

如果在捕获时捕获数据包的全部内容, 这需要更多的 CPU 时间来将数据包复制到您的应用程序, 更多的磁盘和可能的网络带宽将数据包数据写入 文件,以及更多的磁盘空间来保存数据包。如果您不需要 数据包的全部内容 - 例如,如果您只是 对数据包的 TCP 标头感兴趣 - 您可以设置“快照 长度”为捕获到一个适当的值。如果快照 length 设置为 snaplen,且 snaplen 小于 a 的大小 捕获的数据包,仅该数据包的第一个 snaplen 字节 将被捕获​​并作为数据包数据提供

你可以通过shotpcap_snapshot()获取当前的snaplen

【讨论】:

  • 感谢您的回答,但是当我的应用程序正在运行并且在调用 pcap_dispatch() 之前已初始化 libpcap 时,我无法设置新的环形缓冲区大小
  • 你必须在两次编译之间改变大小。
  • 谢谢!为了改变环形缓冲区的大小,我唯一能做的就是停止应用程序并设置一个新的大小?
  • 我的意思是这是最简单的方法,但我想你可以实现一个命令来调用pcap_set_snaplen()
  • pcap_set_snaplen() 只改变数据包的大小。但我的主要目标是获取有关我的应用程序工作时剩余多少可用空间的信息。例如,我设置环形缓冲区的大小为 128000000 并得到丢弃的数据包
猜你喜欢
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
相关资源
最近更新 更多