UDP错误10054:远程主机强迫关闭了一个现有的连接

UDP错误10054:远程主机强迫关闭了一个现有的连接

原文地址:http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic1887.aspx

在公司一项目的UDP消息服务开发中时不时的会遇到这样一个问题:在UDP通信过程中,如果客户端中途断开,服务器会收到一个SocketException,错误ID为10054,描述是“远程主机强迫关闭了一个现有的连接”,紧接着的事就可怕了,UDP服务终止监听,所有客户端都受到了影响。也就是说一个客户端引起的异常导致了整个系统的崩溃。这个问题可是太严重了。

地球人都知道,UDP是无连接的,怎么会出现这个异常呢?百度了一圈,发现有这个问题的现象还不少,可就是没有一个有效的回复。再GOOGLE一圈,有点眉目了。找到了一个微软的解释和一个DOTNET的解决方法:

微软的解释:http://support.microsoft.com/kb/263823

DOTNET的处理方法:http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic1887.aspx

不过处理方法似乎对参数的设置不太正确:    byte[] optionInValue = { Convert.ToByte(true) };     byte[] optionOutValue;

按照这样设置还是会抛出该异常。    首先,根据微软的解释,optionInValue 传入的应该是false,而不是true;     其次,根据微软的解释,optionOutValue应该是一个DWORD值,不应不赋值,或设为null。

根据以上两点,将以上两句改为:    byte[] optionInValue = { Convert.ToByte(false) };     byte[] optionOutValue = new byte[4];

经过测试,模拟500个用户进行登录、收发消息、注销、异常退出、再连接,均没有再抛出该异常。服务表现稳定。

在UDP通信过程中,如果客户端中途断开,服务器会收到一个SocketException,错误ID为10054,描述是“远程主机强迫关闭了一个现有的连接”,紧接着的事就可怕了,UDP服务终止监听,所有客户端都受到了影响。也就是说一个客户端引起的异常导致了整个系统的崩溃。

找了好几天了。终于找到了解决办法。

在初始化对象后设置属性如下:

uint IOC_IN = 0x80000000;    uint IOC_VENDOR = 0x18000000;     uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;     ClientSocket.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 文档。

本人体会:

再做通信项目中无意中遇到了这个问题,记得上学的时候老师说过UDP是无连接的,但是在项目中遇到了这个远程主机强制关闭现有连接的错误,搞得一头雾水,什么也不用说,马上google一下,发现很多朋友都有遇到了这个问题,最后还是看到了原作者的这篇文章后解决了问题,呵呵,再次转载过来,希望帮助所有遇到这个问题的朋友快速的解决问题。

时间: 2024-08-04 01:35:05

UDP错误10054:远程主机强迫关闭了一个现有的连接的相关文章

Unexpected EOF 远程主机强迫关闭了一个现有的连接 如何处理

由于数据量的增大,调用接口的次数会增加. 当连续向目标网站发送多次request后,目标网站可能会认为是,恶意攻击. 于是会抛出requests异常. 测试代码: for i in range(200): # 连续请求200次 requests.post(p['url'], headers=p['headers'], json=p['body'], verify=False) 在python3.6中,异常为 requests.exceptions.SSLError: HTTPSConnectio

HAProxy出现"远程主机强迫关闭了一个现有的连接 " 的错误及解决

使用haproxy作为sql server 的负载均衡器. 使用了文档中的示例配置项: timeout client 50s        timeout server 50s 采用这个配置项,有时会出现“远程主机强迫关闭了一个现有的连接”的错误. 出现这个错误的原因是:一旦sql client超过50s没有给haproxy发送数据,则haproxy会关闭这个连接,此时sql client中的以为连接还是通的,此时发送数据就会出现异常. 在查看了HAProxy的官方文档,以及mysql和sql

Adb connection Error:远程主机强迫关闭了一个现有的连接 解决方法

用真机调试程序的时候,eclipse 的 Console 总是出现如下的错误"Adb connection Error:远程主机强迫关闭了一个现有的连接".     问题出现的原因:这是 DDMS 调用 adb 引发的.经过一番搜索,发现这是 Windows 环境下,adb 的一个限制,也可以说是 bug.当手机上同时运行的进程数大于 64 时, 就会引发 adb 奔溃.更深层次的原因,就是 Windows API 的 WaitForMultipleObjects 所支持的最大句柄数是

android:Adb connection Error:远程主机强迫关闭了一个现有的连接

用真机调试程序的时候,eclipse的console总是出现如下的错误"Adb connection Error:远程主机强迫关闭了一个现有的连接" 问题出现的原因:这是ddms调用adb引发的. 经过一番搜索, 发现这是windows环境下, adb的一个限制, 也可以说是bug. 当手机上同时运行的进程数大于64时, 就会引发adb奔溃. 更深层次的原因, 就是windows API的WaitForMultipleObjects所支持的最大句柄数是MAXIMUM_WAIT_OBJE

socket_read(): 远程主机强迫关闭了一个现有的连接。

bug 心得 服务器端程序: 客户端程序: 运行程序后出现错误:socket_read(): 远程主机强迫关闭了一个现有的连接. 服务器端程序修改及原因分析:

Adb connection Error:远程主机强迫关闭了一个现有的连接

做android开发的时候eclipse的console一直出现这个问题,有时候是启动eclipse后就出现这个问题,有时候是运行android程序的时候出现的,重启avd和重启eclipse都不行.后面在网上找到了解决办法. 先说原因嘛,这是ddms调用adb引发的. 经过一番搜索, 发现这是windows环境下, adb的一个限制, 也可以说是bug.  当手机上同时运行的进程数大于64时, 就会引发adb奔溃. 更深层次的原因, 就是windows API的WaitForMultipleO

Android真机调试——远程主机强迫关闭了一个现有的连接。

以前用真机调试程序的时候,Android Studio 出现如下的错误 [2016-11-12 10:37:36 - DeviceMonitor] Adb connection Error:远程主机强迫关闭了一个现有的连接. [2016-11-12 10:37:38 - DeviceMonitor] Connection attempts: 1 查找资料发现问题出现的原因:这是 DDMS 调用 adb 引发的.经过一番搜索,发现这是 Windows 环境下,adb 的一个限制,也可以说是 bug

无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接

我们添加客户端服务引用的时候会出现这样的错误: 下载“http://localhost:8002/WCFService”时出错. 基础连接已经关闭: 接收时发生错误. 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接.. 远程主机强迫关闭了一个现有的连接. Metadata contains a reference that cannot be resolved: 'http://localhost:8002/WCFService'. Metadata contains a refe

解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接

开发中所用的数据需要通过WCF进行数据传输,结果就遇到了WCF大量传输问题 也就是提示System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接 网上解决方案都是千篇一律互相转发的,并且没有明确的解决方案或者按照,各个博客中的解决方案都没能解决这个问题. 为此我整整浪费了一天时间用来解决这个问题,而且用了最笨的办法一点点的尝试网上所查到的方案.对于精研WCF来说的这可能是一个小问题,但是对于仅仅了解wcf,一知半解的会很困惑.将解决方案贴出来希望能帮