在UDP通信过程中, 使用try...catch语句接受数据时,总是会出现一个错误:
System.Net.Sockets.SocketException (0x80004005): 远程主机强迫关闭了一个现有的连接。
最初的最愚蠢的解决方法就是,在catch语句里不做任何动作,让监听端口函数继续运行。但这并非一个长久之计,后来在网上找了 好久,找到了微软的解释和国外论坛DOTNET的一个解决方案。
微软的解释:http://support.microsoft.com/kb/263823
DOTNET的处理方法:http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic1887.aspx
在初始化对象后设置属性如下:
uint IOC_IN = 0x80000000;
uint IOC_VENDOR = 0x18000000;
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
//uc为接收数据所使用的UdpClient,不同程序自己手改
uc.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] {Convert.ToByte(false)}, null);
Socket.IOControl 方法 (IOControlCode, Byte[], Byte[])
使用 IOControlCode 枚举指定控制代码,为 Socket 设置低级操作模式。
ioControlCode
一个 IOControlCode 值,它指定要执行的操作的控制代码。
optionInValue
Byte 类型的数组,包含操作要求的输入数据。
optionOutValue
Byte 类型的数组,包含由操作返回的输出数据。
optionOutValue 参数中的字节数。
异常
异常类型 | 条件 |
---|---|
试图访问套接字时发生错误。有关更多信息,请参见备注部分。 | |
Socket 已关闭。 | |
试图不使用 Blocking 属性更改阻止模式。 |
备注
此方法提供对 Socket 类的当前实例所基于的操作系统 Socket 的低级访问。有关更多信息,请参见 MSDN Library 中的 WSAIoctl 文档。