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

article/2025/9/28 13:04:55

在公司一项目的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 文档。


http://chatgpt.dhexx.cn/article/c1gYSWjs.shtml

相关文章

Git clone项目报错-errno 10054

Git clone项目报错:Error:R P C failed;curl 56 Open SS L SS L_read:Connection was Reset, err no 10054 在网上找了很久都没有合适的答案,特地去stackFlow上面看了一下,一个印度人解说的是正确的: 具体原因:克隆的时候没有git in it,网络…

git错误10054

git错误10054 背景:今天用git克隆,结果发现克隆不了,报错10054 问题: 原因:服务器的SSL证书没有经过第三方机构的签署,导致连接无法连上去,如果没有经过第三方机构签署,远程仓库无…

【Python爬虫错误】ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接

今天写爬虫爬取天天基金网站(http://fund.eastmoney.com/)时出现如下图所示的错误。 分析原因,是因为使用urlopen方法太过频繁,引起远程主机的怀疑,被网站认定为是攻击行为。导致urlopen()后,request.read…

10054 java_【理解】 Error 10053和 Error 10054

1. 10053 这个错误码的意思是: A established connection was aborted by the software in your host machine, 一个已建立的连接所在主机的软件中止 2. 10054 这个错误码的意思是: Connection closed by peer, 连接已经被对方关闭 10053 出现的可能原因是&#xf…

mysql 端口号_mysql的端口号(mysql常用端口号)

mysql的端口号(mysql常用端口号) 2020-05-07 21:58:15 共10个回答 mysql的默认端口号是多少 mysql默认端口号为3306,修改端口号方法:修改配置文件/etc/my.cnf 如何查看mysql的端口号 1使用命令showglobalvariableslikeport;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有…

IT开发+软件测试常用端口号

目录 一、端口号二、非常常用端口号-软件测试 ★★★★★三、一般常用端口号 ★★★☆☆四、端口概述 ★★☆☆☆五、端口一览表详情 ★☆☆☆☆一、端口号 具有网络功能的应用软件的标识号。注意,端口号是不固定的,即可以由用户手工可以分配(当然,一般在软件编写时就已经…

Hadoop之常用端口号

hadoop3.xHDFS NameNode 内部通常端口:8020、9000、9820HDFS NameNode 对用户的查询端口:9870Yarn查看任务运行情况的端口:8088历史服务器:19888HDFS NameNode 对用户的查询端口:9870,经常查看目录信息&…

服务器网站常用端口号,web服务器常用端口号

关于 web服务器常用端口号的搜索结果 回答 一般常用的端口号为:WWW是80&xff0c;FTP是21&xff0c;SMTP是25&xff0c;你可以通过修改端口号来提高IIS服务器的安全性。如果你修改了端口设置&xff0c;只有知道端口号的用户才可以访问&xff0c;但用户在访问时需要指定新端…

SQL语句截取字段某指定字符的前半段/后半段内容

最近项目中遇到一个小问题: 需要从数据库中取出对应数据,并根据某个字段中的前半段内容进行排序,搜索资料后得以解决,现将解决方法记录如下: 最初的查询SQL: SELECT file_name,sort FROM base_annexesfil…

sql常用函数详解(一)——字符串截取

1.substring函数——截取字符串 SUBSTRING ( expression, start, length ) expression——字符串、二进制字符串、文本、图像、列或包含列的表达式。请勿使用包含聚合函数的表达式。 start——整数或可以隐式转换为int 的表达式,指定子字符串的开始位置。 length——…

sql截取数据

1、left从左开始截取字符串 left(string, length) -- (字符串,截取长度)示例:SELECT id,LEFT(id,4) FROM organization 运行结果: 2、right从右开始截取字符串 right(strin…

sql数据库,截取语句(截取每列中的字段)

制表人也是省事,把这些信息放在一列中,现在需要取红框圈着的数据,有一百多行,操作了十多行,实在是蛋疼,还是用sql搞吧 首先把excel表导入sqlserver中 //表名为“疑点详细说明”,22为姓名身份证…

SQL语句:如何截取指定字段某一个字符的前面/后面的字符串?

假设数据库中,某一列数据像这样,每个数据都有同一个字符“-”,这时如果我们需要获取这个字符的前面的字符串或后面的字符串,应该用什么SQL语句呢? SUBSTRING ( expression, start, length ) --SUBSTRIN…

SQL server 字符串截取

--1、LEFT()方法--- --函数说明--- --1)语法:LEFT(character,integer) --2)介绍:参数1:要截取的字符串,参数2:截取字符个数 --3)使用: --返回从字符串左边开始指定个数…

sql语句之字符串截取(substring_index)

一、substring_index: 实现提取表单列表中的字符串 来源:https://www.cnblogs.com/mqxs/p/7380933.html 1、格式: substring_index(str,delim,count)2、注释: str:要处理的字符串delm:分隔符count&#…

【SQL时间截取】数据库Sql实现截取时间段和日期

【写在前面】前些日子接到这样的需求,我们要对用户访问网站的时间做个统计,但是我想统计到具体的时间点,便于统计不同时间段(上午、下午、傍晚、凌晨)访问的人数占比。 数据库Sql实现截取时间段和日期 1、原始数据查看…

SQL SERVER字符串截取,SQL SERVER根据指定字符截取

字符串截取 字符串截取函数:substring(str,startlen,endlen) 需要截取的字符:str 开始长度:startlen --从1开始 结束长度:endlen -从1开始 用法:select substring(“abcdefg”,1,2) 输出:bc 为啥这么麻烦&…

sql查询中截取字符串

SQL 语句中查询结果字符截取left,right,substrng用法 在SQL的实际用途中,经常会碰到需要对查询结果值需要做字段的一些截取,下面列举经常用到的三种常用截取方式。 1.LEFT(str, length):从左边开始截取str,length是截取的长度&…

sql server提供三种常用截取字符串方法,LEFT()、RIGHT()、SUBSTRING()

一、sql server提供了三种常用截取字符串方法,LEFT()、RIGHT()、SUBSTRING() 1、LEFT()函数语法:LEFT(character,integer) 注释:参数1:要截取的字符串,参数2:截取字符个数说明:返回从字符串左边…

SQL中的字符串截取函数

字符串截取函数,也是我们在数据开发分析的过程中比较常用的函数,比较常用的函数,有四个 left()、right()、substr()、substring_index() 函数。 一、left()函数 含义:返回从字符串左边开始指定个数的字符 语法格式:le…