游戏更新到 87%,进度条停住,弹窗 socket error 10054,点重试还是断在差不多的地方。
socket error 是网络层的报错,不是游戏本身的 bug。后面的数字才是关键,10054 表示连接被对端重置。
先认几个错误码
- 10054:对方或者中间设备把连接掐了,常见于防火墙、代理、服务器限流。
- 10060:连接超时,目标没响应,多半是端口不通。
- 10061:对方拒绝连接,服务没起来或者端口写错。
- 11001、11004:域名解析失败,DNS 的问题。
这几个记住了,排查方向基本就定了,不用一上来就重装系统。
10054 的处理顺序
先换网络。手机热点试一次,热点下不断,问题就在原来的路由器或者运营商链路上。公司网络还要看有没有上网行为管理设备,它会对大流量长连接做重置。
再看代理和杀毒软件的网络防护。这两类都会拦长连接,临时关掉试一次就知道。
剩下的就是服务端。赶上大版本更新,服务器扛不住会主动断,这种只能等,或者错峰下载。
几个容易看错的方向
本机时间不对也会报错。TLS 握手要校验证书有效期,系统时间差几个月,连接在握手阶段就断,报出来的却像网络问题。
MTU 也能惹事。走 VPN 或者拨号上网时,包被分片,大文件传到某个位置就停,把 MTU 调到 1400 试一次。
无线信号弱的时候,丢包重传会把连接拖住,表现是长时间卡着然后报错,不是立刻断开。看路由器上的协商速率,能判断是不是这个原因。
写代码时要注意的
TCP 收到的数据要按长度拼,不能假设一次 recv 就是一条完整消息。分包没处理好,表现也是莫名其妙的断开。
还有 keepalive。长时间没数据的连接会被中间的 NAT 表清掉,设心跳比事后重连省事。
日志里连续出现同一个错误码,才说明是能稳定复现的问题。只出现一次,多半是链路抖动,不值得深挖。