C# SharpPcap-传入数据包被丢弃

C# SharpPcap-传入数据包被丢弃,c#,ethernet,sharppcap,C#,Ethernet,Sharppcap,我正在编写一个C#应用程序,它通过以太网与外部设备通信。我正在为此使用SharpPcap 4.5.0版 不幸的是,我不得不意识到一些传入的数据包被丢弃了。为了进行测试,我还在外部设备和我的计算机之间设置了一个交换机,它也会记录每个数据包。在此日志上,数据包可见。因此,我非常确定数据包确实被发送了(并且它不是外部设备的错误) 这是我使用的代码: public bool TryActivateChannel(uint channelNumber, out string message) {

我正在编写一个C#应用程序,它通过以太网与外部设备通信。我正在为此使用SharpPcap 4.5.0版

不幸的是,我不得不意识到一些传入的数据包被丢弃了。为了进行测试,我还在外部设备和我的计算机之间设置了一个交换机,它也会记录每个数据包。在此日志上,数据包可见。因此,我非常确定数据包确实被发送了(并且它不是外部设备的错误)

这是我使用的代码:

public bool TryActivateChannel(uint channelNumber, out string message)
    {
        message = string.Empty;
        devices[(int)channelNumber].Open(DeviceMode.Promiscuous);
        devices[(int)channelNumber].OnPacketArrival += PacketArrived;
        devices[(int)channelNumber].StartCapture();
        return true;
    }

public bool CloseChannel(uint channelNumber, out string message)
        {
            message = string.Empty;
            devices[(int)channelNumber].OnPacketArrival -= PacketArrived;
            devices[(int)channelNumber].Close();
            return true;
        }
private void PacketArrived(object sender, CaptureEventArgs e)
        {
            if (e.Packet.LinkLayerType != PacketDotNet.LinkLayers.Ethernet)
            {
                return;
            }
            else
            {
                inputQueue.Enqueue(e);
            }
}
设备只是CaptureDeviceList。Instance和inputQueue是一个ConcurrentQueue,它在另一个线程中退出队列。此线程将每个传入的数据包写入*.pcap文件(其中数据包丢失)。此外,我还查看了ICaptureDevice的Statistics属性,该属性声明不会丢弃任何数据包。我还尝试在另一台计算机上运行它,以确保它不是网卡的问题

在这一点上,我真的很无助。我的代码有没有做错什么?这是一个已知的问题吗?我在其他地方读到SharpPcap可以管理高达3 MBit/s的数据。我离这个值很远,因此我不认为这是性能问题


附录:我没有使用ConcurrentQueue,而是使用作者提供的列表尝试了这种方法。在这里,我得到了相同的结果:一些数据包丢失了。我还有一个没有第二个线程的版本,其中数据包直接在事件处理程序中处理。相同的结果:数据包丢失。此外,我还与Wireshark同时捕获。在这里,数据包也丢失了。我意识到丢失的数据包都有一个共同点,即它们有一定的长度(大约超过60字节)。对于较短的数据包,我从未注意到它们丢失。我正在使用WinPcap 4.1.3。问题是否存在?

请注意,如果您在WireShark中未看到数据包,则问题既不在代码中,也不在SharpPcap中。 这意味着它要么在硬件中,要么在驱动程序/操作系统中


无法接收数据包的常见原因:

  • 数据包带有VLAN标记,根据适配器配置,它可能会在到达操作系统之前丢弃带有VLAN标记的帧

  • 防火墙:某些防火墙能够阻止数据包到达Npcap/WinPcap驱动程序,这通常会影响IP数据包

  • 错误驱动程序:示例:Npcap错误

  • 数据包“丢弃”:这意味着数据包被硬件本身拒绝, 您可以使用命令
    netstat-e
    检查这一点,通常原因如下:

    • 坏电缆:是的,真的
    • 帧冲突:半双工电缆和数据包之间的时间太短时发生的频率更高

请注意,如果您在WireShark中没有看到数据包,则问题既不在代码中,也不在SharpPcap中。 这意味着它要么在硬件中,要么在驱动程序/操作系统中


无法接收数据包的常见原因:

  • 数据包带有VLAN标记,根据适配器配置,它可能会在到达操作系统之前丢弃带有VLAN标记的帧

  • 防火墙:某些防火墙能够阻止数据包到达Npcap/WinPcap驱动程序,这通常会影响IP数据包

  • 错误驱动程序:示例:Npcap错误

  • 数据包“丢弃”:这意味着数据包被硬件本身拒绝, 您可以使用命令
    netstat-e
    检查这一点,通常原因如下:

    • 坏电缆:是的,真的
    • 帧冲突:半双工电缆和数据包之间的时间太短时发生的频率更高

作者提供了一个可供参考的方法。该代码中的
不是可选的。@HansPassant非常感谢您的回复。我也尝试过这种方法,但没有成功。请参阅我在问题中提供的其他信息。我有相同的问题,我有一个amd 3950x。。。所以这不是cpu的问题。在我的例子中,速度约为15kb/s,并且包仍在丢弃作者提供的一个工作包。该代码中的
不是可选的。@HansPassant非常感谢您的回复。我也尝试过这种方法,但没有成功。请参阅我在问题中提供的其他信息。我有相同的问题,我有一个amd 3950x。。。所以这不是cpu的问题。在我的例子中,速度约为15kb/s,包仍在下降