电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

UDP连接被重置错误10054的问题


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

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

而这个问题最要命的是如果你不采取措施每次调用读操作都会引发该异常!

唯一恢复正常的办法就是把Socket关掉重开

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

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

const int SIP_UDP_CONNRESET=;

socketIOControl(SIP_UDP_CONNRESET new byte[] { } null)

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

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

上一篇:tcpip.sys文件损坏导致无法上网

下一篇:WindowsXPIEEE802.11无线访问故障排除