SharpPcap — входящие пакеты отбрасываются

Я пишу приложение С#, которое взаимодействует с внешним устройством через Ethernet. Для этого я использую 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 (где пакеты отсутствуют). Кроме того, я просматриваю свойство Statistics моего ICaptureDevice, которое утверждает, что ни один пакет не был отброшен. Я также попытался запустить его на другом компьютере, чтобы убедиться, что это не проблема сетевой карты.

В этот момент я действительно беспомощен. Я сделал что-то не так в своем коде? Это известная проблема? Я где-то читал, что SharpPcap может управлять скоростью до 3 Мбит/с. Я далек от этого значения, поэтому я не считаю, что это проблема производительности.

Дополнение: Вместо ConcurrentQueue я также попробовал подход со списком, предоставленным автором. Там у меня тот же результат: Некоторые пакеты отсутствуют. У меня тоже была версия без второго Thread, где пакеты обрабатываются прямо в обработчике событий. Тот же результат: пакеты отсутствуют. Тем более я захватывал одновременно с Wireshark. Здесь пакеты также отсутствуют. Я понял, что все недостающие пакеты объединяет то, что они имеют определенную длину (примерно более 60 байт). Для более коротких пакетов я никогда не замечал их отсутствия. Я использую WinPcap 4.1.3. Проблема находится там?


person SomeBody    schedule 04.03.2019    source источник
comment
Автор предоставил достойный пример для работы. lock в этом коде не является обязательным.   -  person Hans Passant    schedule 04.03.2019
comment
@HansPassant Большое спасибо за ваш ответ. Я также пробовал этот подход, но безуспешно. См. дополнительную информацию, которую я предоставил в своем вопросе.   -  person SomeBody    schedule 06.03.2019
comment
У меня такая же проблема, и у меня amd 3950x... так что это не проблема процессора. В моем случае скорость около 15 кб/с, а пакеты все равно отваливаются.   -  person hamboy75    schedule 08.04.2020


Ответы (1)


Кстати, если вы не видите пакеты в WireShark, проблема не в вашем коде и не в SharpPcap. Это означает, что это либо в оборудовании, либо в драйвере/ОС.


Распространенные причины, по которым вы не получаете пакеты:

person Ayoub Kaanich    schedule 09.10.2020