C#: UdpClient не отправляет данные при вызове close() в ближайшее время
На некоторых компьютерах у меня возникает странный эффект, что 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 всегда будет равным data.Length
- На компьютерах, не отправляющих пакеты, 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 ответ
ОК, это не имеет ничего общего с.NET и моим программным обеспечением. Кажется, что антивирусный сканер также сканирует весь сетевой трафик. И поэтому функции библиотеки.NET для отправки пакетов UDP фактически отправили пакет, но сканер отбрасывает его, если UdpClient.Close() был вызван слишком скоро после метода Send ().
Итак, теперь есть два возможных обходных пути (это сработало для меня)
- Введите немного сна перед вызовом UdpClient.Close() (достаточно около 4 мс)
- Удалите антивирусный сканер и попробуйте другой (Microsoft Security Essentials не показывает этот эффект)