C #: UdpClient не отправляет данные при вызове close () в ближайшее время - PullRequest
2 голосов
/ 14 октября 2011

На некоторых компьютерах у меня возникает странный эффект, что UdpClient не будет отправлять данные, когда UdpClient.Close () вызывается слишком рано после UdpClient.Send ().Я использую .NET 4.0 и WireShark для проверки потери пакетов.

Важная часть кодирования:

UdpClient sender = new UdpClient();
sender.Connect( new IPEndPoint( this.ipAddress, this.Port ) );
int bytesSent = sender.Send( data, data.Length );
sender.Close();

Weired:

  • На большинстве компьютеров данные будут отправлены без проблем
  • Нет исключений или других ошибок, даже если пакет не был отправлен
  • bytesSent всегда будет равняться данным. Длина
  • На компьютерахне отправлять пакеты Thread.Sleep (250) прямо перед вызовом sender.Close () решит проблему!

Итак, что может отменить отправку пакетов, даже после сообщения UdpClient.Send ()правильное количество байтов?Почему это проявляется только на определенных машинах?Может ли это быть другим поведением некоторых сетевых драйверов, антивирусного программного обеспечения и т. П.?

Я также попытался явно указать LingerOptions, который не должен быть необходим, поскольку по умолчанию отправляются все ожидающие данные перед закрытием основного сокета.,Тем не менее, при выполнении sender.Client.LingerState = new LingerOption (true, 10) (как описано в http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.lingerstate.aspx), я получаю

 SocketException (0x80004005): An unknown, invalid, or unsupported option 
 or level was specified in a getsockopt or setsockopt call.

Есть идеи, что происходит?

С уважением, Семь

1 Ответ

2 голосов
/ 17 октября 2011

ОК, это не имеет ничего общего с .NET и моим программным обеспечением.Кажется, что антивирусный сканер также сканирует весь сетевой трафик.Таким образом, функции библиотеки .NET для фактической отправки пакетов UDP сделали отправки пакета, но сканер отбрасывает его, если UdpClient.Close () был вызван слишком скоро после метода Send ().Итак, теперь есть два возможных обходных пути (которые сработали для меня)

  1. Добавьте немного сна перед вызовом UdpClient.Close () (достаточно примерно 4 мс)сканер вирусов и попробуйте другой (Microsoft Security Essentials не показывает этот эффект)
...