【发布时间】: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,而且包仍在下降