한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › L8 Socket 与协议

Windows UDP socket 的 WSAECONNRESET 错误 WSAECONNRESET on a Windows UDP socket

原因 ID sk-udp-connreset · 主责 研发团队·服务器开发

在含图示和实验的完整版中打开此卡片 →

Windows 服务器向已经离开的客户端发 UDP 时,会收到“端口不可达”(ICMP)通知。这个通知会让下一次接收调用以错误结束;如果服务器代码把这个错误当作 socket 本身坏了来处理,所有使用这个 socket 的人都会受影响。

起因 一直向刚离开的客户端地址发 UDP,收到“端口不可达”(ICMP)通知 → 结果 Windows 让接下来的接收调用以 WSAECONNRESET(10054)错误结束,服务器代码停止接收或关闭 socket → 画面表现 使用这个 socket 的所有人一起卡住、掉线

症状
掉线, 卡住
因素
丢包, 停顿
谁会遇到
全服
何时出现
偶尔随机, 刚登录/维护结束后
负责方
主责 研发团队·服务器开发
研发团队要做的事
用 WSAIoctl 关闭 SIO_UDP_CONNRESET,不再接收这个通知;接收出错时也只记日志、继续接收。
监控图上
连接成批断开 · 连接数、接收错误日志
查看位置
在游戏服务器日志里找 UDP 接收错误码(WSAECONNRESET、10054)以及接收循环停止或关闭 socket 的记录,用服务器侧抓包确认之前是否收到了 ICMP Port Unreachable
确认依据
连接集中断开前记录到 WSAECONNRESET 接收错误,在那之前刚离开的客户端地址发来了 ICMP Port Unreachable
排除依据
Linux 服务器,或代码已关闭 SIO_UDP_CONNRESET,则不适用
确认手段
需要游戏服务器/客户端的日志和指标

出处

  1. Winsock IOCTLs Microsoft
    用 SIO_UDP_CONNRESET 开启或关闭 UDP“端口不可达”(PORT_UNREACHABLE)通知的上报
  2. recvfrom function (winsock.h) Microsoft
    UDP socket 上的 WSAECONNRESET 表示之前的发送收到了 ICMP Port Unreachable
  3. Windows Sockets Error Codes Microsoft
    WSAECONNRESET 错误号 10054

相关原因

同一层:L8 Socket 与协议

其他层中同样导致“掉线”的原因

查看含图示和实验的原卡片