关于C#:recv是否从pcaps缓冲区中删除数据包?

Does recv remove packets from pcaps buffer?

假设在计算机上运行了两个程序(为简化起见,这是唯一在Linux上运行的用户程序),其中一个调用recv(),其中一个正在使用pcap检测进入的数据包。数据包到达,程序通过使用pcap的程序以及使用recv的程序都将其检测到。但是,在任何情况下(例如在调用pcap_next()之间返回recv()),这两种情况之一都不会获得数据包吗?

我真的不明白缓冲系统在这里是如何工作的,因此,进行更详细的解释会更好-在任何一种可能的情况下,这些程序中的一个会看到一个包而另一个则看不到?如果是的话,那是什么,我该如何预防呢?


AFAIK,确实存在一种情况,其中一种将接收数据而另一种则不会(两种方式)。我可能在这里弄错了一些细节,但是我敢肯定有人会纠正我的。

Pcap使用不同的机制来监听接口,但一般情况如下:

  • 网卡接收数据包(通过中断通知驱动程序)
  • 内核将该数据包放入适当的侦听队列中,例如,

    • TCP堆栈。
    • 桥接驱动程序(如果接口已桥接)。
    • PCAP使用的接口(原始套接字连接)。
  • 这些缓冲区彼此独立地刷新:

    • 当TCP流被组装并将数据传递到进程时。
    • 当网桥将数据包发送到适当的连接接口时。
    • 当PCAP读取接收到的数据包时。

我猜想没有什么办法可以保证两个程序都能接收到两个数据包。这将需要在缓冲区已满时阻塞(这可能导致饥饿,死锁,各种问题)。除以太网以外的其他互连也是可能的,但是总的思想是尽力而为。

但是,除非系统处于高负荷状态,否则我会说丢失率将非常低,并且大多数数据包将被所有人接收。您可以通过增加缓冲区大小来降低丢失的风险。快速的Google搜索对此进行了调整,但我敢肯定还有一百万种方法可以做到这一点。

如果您需要硬性保证,我认为需要更强大的网络模型。我听说过Netgraph在这类任务上的出色表现。您也可以只安装一个物理箱来检查数据包(您可以获得的最严格的保证)。