C#编程UDP通信过程中出现【远程主机强迫关闭了一个现有的连接0x80004005】的解决方法

一直郁闷 UDP不是面向非连接的??

 

在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 参数中的字节数。

 异常
异常类型 条件

SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

ObjectDisposedException

Socket 已关闭。

InvalidOperationException

试图不使用 Blocking 属性更改阻止模式。

 备注

此方法提供对 Socket 类的当前实例所基于的操作系统 Socket 的低级访问。有关更多信息,请参见 MSDN Library 中的 WSAIoctl 文档。

 

希望对碰到这个问题的朋友有帮助。不用像我找好几天

你可能感兴趣的:(C#,udp,Socket,远程连接关闭,DotNet,数据通信)