首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SharpPcap -传入数据包被丢弃。

SharpPcap -传入数据包被丢弃。
EN

Stack Overflow用户
提问于 2019-03-04 14:41:30
回答 1查看 445关注 0票数 1

我正在编写一个通过以太网与外部设备通信的C#应用程序。为此,我使用的是SharpPcap版本4.5.0。

不幸的是,我不得不意识到一些传入的数据包被丢弃了。为了进行测试,我还在外部设备和我的计算机之间设置了一个开关,它也记录了每一个数据包。在这个日志中,数据包是可见的。因此,我确信数据包确实被发送了(而且它不是外部设备的错误)。

这是我使用的代码:

代码语言:javascript
复制
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。问题在那里吗?

EN

回答 1

Stack Overflow用户

发布于 2020-10-09 21:50:45

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

不接收数据包的常见原因:

  • 数据包是VLAN标记的,根据适配器配置,它可能会在到达OS之前丢弃VLAN标记的帧。
  • 防火墙:一些防火墙能够阻止数据包到达Npcap/WinPcap驱动程序,这通常会影响IP数据包。
  • 错误驱动程序:例如: Npcap https://github.com/nmap/npcap/issues/119
  • 数据包“丢弃”:这意味着数据包被硬件本身拒绝,您可以使用命令netstat -e检查这一点,通常的原因如下:
代码语言:javascript
复制
- Bad cables: yes, really.
- Frame collision: occurs more frequently with half duplex cables and when the time between packets is too short.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54985524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档