SharpPcap - 传入的数据包被丢弃
Posted
技术标签:
【中文标题】SharpPcap - 传入的数据包被丢弃【英文标题】:SharpPcap - Incoming packets are dropped 【发布时间】:2019-07-25 21:36:20 【问题描述】:我正在编写一个通过以太网与外部设备通信的 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。问题出在哪里?
【问题讨论】:
作者提供了一个decent example 来工作。该代码中的lock
不是可选的。
@HansPassant 非常感谢您的回复。我也尝试过这种方法,但没有成功。请参阅我在问题中提供的其他信息。
我也有同样的问题,而且我有一个 AMD 3950x...所以这不是 CPU 问题。就我而言,速度约为 15kb/s,而且包仍在下降
【参考方案1】:
作为记录,如果您在 WireShark 中看不到数据包,则问题既不在您的代码中,也不在 SharpPcap 中。 这意味着它要么在硬件中,要么在驱动程序/操作系统中。
收不到包的常见原因:
数据包带有 VLAN 标记,根据适配器配置,它可能会在到达操作系统之前丢弃带有 VLAN 标记的帧。
防火墙:一些防火墙能够阻止数据包到达 Npcap/WinPcap 驱动程序,这通常会影响 IP 数据包。
错误的驱动程序:示例:Npcap 错误https://github.com/nmap/npcap/issues/119
数据包“丢弃”:这意味着数据包被硬件本身拒绝,
您可以使用命令netstat -e
进行检查,通常原因:
【讨论】:
以上是关于SharpPcap - 传入的数据包被丢弃的主要内容,如果未能解决你的问题,请参考以下文章
.net 数据包捕获:pcap.net 与 Sharppcap