Я пишу приложение С#, которое взаимодействует с внешним устройством через 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. Проблема находится там?
lock
в этом коде не является обязательным. - person Hans Passant   schedule 04.03.2019