我正在编写一个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。问题在那儿吗?
答案 0 :(得分:0)
作为记录,如果您没有在WireShark中看到数据包,则问题既不在代码中也不在SharpPcap中。 这意味着它在硬件中或在驱动程序/操作系统中。
未收到数据包的常见原因:
这些数据包带有VLAN标记,具体取决于适配器的配置,它可能会在到达操作系统之前丢弃VLAN标记的帧。
防火墙:某些防火墙能够阻止数据包到达Npcap / WinPcap驱动程序,这通常会影响IP数据包。
错误的驱动程序:示例:Npcap错误https://github.com/nmap/npcap/issues/119
“丢弃”数据包:这意味着数据包被硬件本身拒绝,
您可以使用命令netstat -e
进行检查,通常是出于以下原因: