转载地址:https://www.cnblogs.com/leading/archive/2012/06/24/udp-connection-reset-10054-under-windows.html

因为这个问题,我很想抽微软。网上其他人有类似的问题,我也碰到了,没有很好的解决方案。这个问题是Winsock所特有的(最起码所有的问题都是在Windows平台下)。一般在使用UDP Socket时,我们发出去数据,是不管它到不到达的,而且UDP并不是面向连接的,所以在收到这个错误时,会感觉很奇怪:“连接被重置10054”。

这个错误一般是使用UDP Socket接受时收到(这里我不讲具体的语言了,不管你用C#、Python还是C,在Windows下都会有类似的问题,只要你调用类似ReceiveFrom函数)。这是上一次Send操作向一个地址发送,但是那个地址没有Socket监听(例如对等体崩溃),那么ICMP控制协议会向我们发送一个Port Unreachable错误,当然这个错误应该包含对方的详细地址等信息,但是Winsock把这个错误转化为Connection Reset,在你下一次调用读操作的时候,引发异常,却没把详细信息给你——例如用C#接受到的对方地址是0.0.0.0。

而这个问题最要命的是,如果你不采取措施,每次调用读操作都会引发该异常!唯一恢复正常的办法就是把Socket关掉,重开。这就非常要命:你要实现一个UDP服务器,把收到的音频发给所有的客户,如果某个客户崩溃了或者网络不好,你的Send不会出问题,但是你Receive的时候却出了问题!好吧,你捕获了异常,重新Receive,还是异常!好吧,你关掉Socket重新建立,但是因为不知道是哪个客户出了问题,所以不能及时把他的地址从发送列表里去除(即使使用心跳检测也要等几秒种),下次Send还是这样,你就不停地关闭创建Socket,谁受的了?

网络上的讨论,最后要么说这是一个bug,要么使用如下代码(以C#为例)

const int SIP_UDP_CONNRESET=-1744830452;
socket.IOControl(SIP_UDP_CONNRESET, new byte[] {0, 0, 0, 0}, null);

设置这个选项忽略那个Reset错误,这样不用重建Socket,只不过每次Socket都会向一些已经关闭的客户发包,浪费了服务器资源;只能通过其他机制确定客户端已经断开,延迟一段时间后才能确定哪个客户端出问题。

我想跟微软说的是,你丫要不就在出问题的地方抛出异常,不然的话把详细错误给了也行,再不行不要强制出一个错误整个Socket就毁了,结果一个都没做到,默认的行为不是正常的UDP行为,还改错误类型,真是欠抽!

Windows下UDP连接被重置错误10054相关推荐

  1. windows下php连接Oracle配置

    windows下php连接Oracle 11g配置 系统 windows8 server 64 PHP集成环境 Wampserver2.2 步骤 1.配置Oracle client到本机的系统环境 从 ...

  2. windows下远程连接Linux桌面

    http://nameyjj.blog.51cto.com/788669/582965 在windows下使用vnc viewer远程连接Linux桌面,主要配置步骤: Linux: 1.rpm -q ...

  3. python学习--windows下安装Numpy包的错误:Unable to find vcvarsall.bat

    今天在安装numpy包的时候,无论是通过pip install numpy 还是上网下载numpy包后安装都是出现问题:error: Unable to find vcvarsall.bat,于是百度 ...

  4. windows下php命令行模式错误信息

    windows下php命令行模式遇错误一闪而过自动关闭窗口,无法看清报错内容.此时,可手动开启一个窗口,然后运行相关代码即可. 转载于:https://www.cnblogs.com/shanhesh ...

  5. apache 在windows下无法启动的一个错误

    apache 版本:2.23 在windows下以服务的方式启动时提示如下: "windows 不能在 本地计算机 启动 Apache2.有关更多信息,查阅系统事件日志.如果这是非 Micr ...

  6. windows下查看错误码与错误信息

    在linux下#include<errno.h>后,错误码被直接写在errno这个全局变量中,错误信息可以通过perror(const char* __s)查看. 在Windows下需要# ...

  7. Windows下UDP编程

    在Windows下进行UDP编程,与Linux下有细微的区别,最主要的区别主要有: 1.头文件不同:windows下仅需要导入头文件winsock2.h,而linux需要包含许多头文件: 2.wind ...

  8. 简明Hadoop配置(3)——windows下eclipse连接虚拟机

    在windows下配置,还需要当心IP地址和eclipse配置时的问题,这需要单独说一下. 在Ubuntu下eclipse新建hadoopIP直接填localhost就好,但是在windows下肯定是 ...

  9. linux/windows下udp测试小工具

    原文:https://www.zendstudio.net/archives/tcp-udp-socket-toolkit/ 还记得我在好久好久之前和你们推荐的Fiddler和Charles debu ...

最新文章

  1. Could not fetch URL https://pypi.org/simple/pip/
  2. mysql 语句除法_SQL的查询语句(除法)
  3. GraphQL入门之什么是GraphQL?
  4. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
  5. 使用electron脚手架electron-vue
  6. Appointment在SPRO里的date profile配置
  7. hssfcolor 不建议使用_不建议使用微信双开的真正原因!
  8. mysql online ddl 5.6_MySQL 5.6的Online DDL功能测试
  9. python双端队列及其实现
  10. Java Web学习笔记09:文件上传与下载
  11. 活动预告|一个重塑区块链行业生态的新物种即将诞生!
  12. 在win7修复计算机中用ISO,win7电脑iso文件怎么打开
  13. 基于CST电磁仿真软件的7-10GHz的微带带通滤波器的设计
  14. HTML特效代码大全
  15. shopnc 设置mysql_shopnc 数据库配置
  16. 计算机无纸化考试合卷答题笔记卡,高级会计师无纸化考试攻略都在这 第一次考也不用慌...
  17. android开发下载功能实现原理图,Android开发者掌握Android图像显示原理
  18. 抖音上线“冬季山货节”,不声不响把拼多多老家“偷了”?
  19. android判断应用是否回到桌面的两种方法
  20. HTML5网页设计图片如何,网页设计中优化图片的6个技巧

热门文章

  1. 黑客帝国文字雨矩阵动画js特效
  2. 数据库中如何将数据库文件转移到其他主机中
  3. Windows电脑挂载阿里云盘为本地磁盘(网络磁盘)
  4. 使用Unity3D实现简单的RPG游戏(附源码)(一)
  5. 【apache-tomcat安装配置】完整教程(保姆级)
  6. access mysql 同步更新数据_[access 数据库同步]Access数据库到Mysql数据库实时更新
  7. 关于WEBQQ的实现(一)
  8. 嘉立创EDA专业版--原理图器件检索查找
  9. 【ubuntu】详解解压命令(.tar、.gz、.tar.gz、.bz2、.tar.bz2、.zip、.rar等)
  10. 智慧社区建设项目项目建议书