C#:UdpClient 很快调用 close() 时不发送数据

Posted

技术标签:

【中文标题】C#:UdpClient 很快调用 close() 时不发送数据【英文标题】:C#: UdpClient not sending data when calling close() to soon 【发布时间】:2011-12-07 18:43:41 【问题描述】:

在某些计算机上,当 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.

有什么想法吗?

问候, 七

【问题讨论】:

【参考方案1】:

好的,这也与 .NET 和我的软件无关。 病毒扫描程序似乎还扫描了完整的网络流量。因此,用于发送 UDP 包的 .NET 库函数实际上确实发送了包,但如果在 Send() 方法之后过早调用 UdpClient.Close(),扫描器会丢弃它。

所以,现在有两种可能的解决方法(对我有用)

    在调用 UdpClient.Close() 之前引入一点睡眠(大约 4ms 就足够了) 删除病毒扫描程序并尝试另一个(Microsoft Security Essentials 不显示此效果)

【讨论】:

以上是关于C#:UdpClient 很快调用 close() 时不发送数据的主要内容,如果未能解决你的问题,请参考以下文章

C# UdpClient 设置超时时间

如何使用 C# UdpClient 发送大数据?

C# UdpClient使用

使用 UdpClient C# 发送对象

C# UDPClient 接受任何 IP 地址

UDP 协议 C# UdpClient乱序接收数据包丢失的问题 Socket ReceiveBufferSize