На некоторых компьютерах у меня возникает странный эффект, что 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.
Есть идеи, что происходит?
С уважением, Семь