在某些计算机上,当 UdpClient.Close() 在 UdpClient.Send() 之后过早调用时,UdpClient 不会发送数据。我正在使用 .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();
奇怪的是:
- 在大多数计算机上,数据将毫无问题地发送
- 即使没有发送数据包也没有异常或其他错误
- bytesSent 将始终等于 data.Length
- 在调用 sender.Close() 之前未发送数据包的计算机上,Thread.Sleep(250) 将解决问题!
那么,即使在 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.
有什么想法吗?
问候,七