SharpPcap-传入数据包被丢弃

时间:2019-03-04 14:41:30

标签: c# ethernet sharppcap

我正在编写一个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);
            }
}

devices只是CaptureDeviceList.Instance,inputQueue是ConcurrentQueue,在另一个线程中出队。该线程将每个传入的数据包写入* .pcap文件(数据包丢失)。此外,我查看了ICaptureDevice的Statistics属性,该属性声称没有数据包被丢弃。我还尝试在另一台计算机上运行它,以确保它不是网卡的问题。

在这一点上,我真的很无助。我的代码有做错什么吗?这是一个已知的问题?我在其他地方读过SharpPcap最多可以管理3 MBit / s。我与这个价值相去甚远,因此我认为这不是性能问题。

附录:我还尝试使用作者提供的List代替ConcurrentQueue。在那里,我得到了相同的结果:一些数据包丢失了。我也有一个没有第二个线程的版本,在该线程中,数据包是在事件处理程序中直接处理的。结果相同:数据包丢失。此外,我与Wireshark同时拍摄。在这里,数据包也丢失了。我意识到丢失的数据包的共同点是它们都有一定的长度(大约60个字节以上)。对于较短的数据包,我从未观察到它们丢失。我正在使用WinPcap 4.1.3。问题在那儿吗?

1 个答案:

答案 0 :(得分:0)

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


未收到数据包的常见原因:

  • 这些数据包带有VLAN标记,具体取决于适配器的配置,它可能会在到达操作系统之前丢弃VLAN标记的帧。

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

  • 错误的驱动程序:示例:Npcap错误https://github.com/nmap/npcap/issues/119

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

    • 电缆不良:是的,真的。
    • 帧冲突:使用半双工电缆以及数据包之间的时间太短时,发生频率更高。