我正在编写一个通过以太网与外部设备通信的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的统计属性,它声称没有丢包。我还尝试在另一台计算机上运行它,以确保它不是网卡的问题。
在这一点上,我真的很无助。我的代码做错了什么吗?这是众所周知的问题吗?我在其他地方读到SharpPcap可以管理高达3Mbit/s,我离这个值很远,所以我不认为这是一个性能问题。
增编:而不是ConcurrentQueue,我也尝试了使用作者提供的列表的方法。在那里,我有同样的结果:一些数据包丢失了。我还有一个没有第二个线程的版本,在该版本中,数据包直接在事件处理程序中处理。同样的结果:数据包丢失。此外,我还和Wireshark同时被捕。在这里,包也丢失了。我意识到,丢失的数据包都有一个共同点,即它们有一定的长度(大约超过60个字节)。对于较短的数据包,我从未观察到它们丢失了。我使用的是WinPcap 4.1.3。问题在那里吗?
发布于 2020-10-09 21:50:45
作为记录,如果您没有在WireShark中看到数据包,那么这个问题既不是在代码中,也不是在SharpPcap中。这意味着它要么在硬件中,要么在驱动程序/操作系统中。
不接收数据包的常见原因:
netstat -e检查这一点,通常的原因如下:- Bad cables: yes, really.
- Frame collision: occurs more frequently with half duplex cables and when the time between packets is too short.https://stackoverflow.com/questions/54985524
复制相似问题