游戏更新到 87%,进度条停住,弹窗 socket error 10054,点重试还是断在差不多的地方。

socket error 是网络层的报错,不是游戏本身的 bug。后面的数字才是关键,10054 表示连接被对端重置。

先认几个错误码

  • 10054:对方或者中间设备把连接掐了,常见于防火墙、代理、服务器限流。
  • 10060:连接超时,目标没响应,多半是端口不通。
  • 10061:对方拒绝连接,服务没起来或者端口写错。
  • 11001、11004:域名解析失败,DNS 的问题。

这几个记住了,排查方向基本就定了,不用一上来就重装系统。

10054 的处理顺序

先换网络。手机热点试一次,热点下不断,问题就在原来的路由器或者运营商链路上。公司网络还要看有没有上网行为管理设备,它会对大流量长连接做重置。

再看代理和杀毒软件的网络防护。这两类都会拦长连接,临时关掉试一次就知道。

剩下的就是服务端。赶上大版本更新,服务器扛不住会主动断,这种只能等,或者错峰下载。

几个容易看错的方向

本机时间不对也会报错。TLS 握手要校验证书有效期,系统时间差几个月,连接在握手阶段就断,报出来的却像网络问题。

MTU 也能惹事。走 VPN 或者拨号上网时,包被分片,大文件传到某个位置就停,把 MTU 调到 1400 试一次。

无线信号弱的时候,丢包重传会把连接拖住,表现是长时间卡着然后报错,不是立刻断开。看路由器上的协商速率,能判断是不是这个原因。

写代码时要注意的

TCP 收到的数据要按长度拼,不能假设一次 recv 就是一条完整消息。分包没处理好,表现也是莫名其妙的断开。

还有 keepalive。长时间没数据的连接会被中间的 NAT 表清掉,设心跳比事后重连省事。

日志里连续出现同一个错误码,才说明是能稳定复现的问题。只出现一次,多半是链路抖动,不值得深挖。