socket error 是什么错误?
浏览器打不开网页、App 提示"网络异常"、程序日志里一堆 socket error,本质都是一个意思:TCP/UDP 连接没能建立,或者建立后被中断。具体原因藏在错误码里,光看"socket error"四个字没法定位。
一、常见错误码对照
- 10048 (WSAEADDRINUSE):端口被占用。启动服务时提示"通常每个套接字地址只允许使用一次"。
- 10049 (WSAEADDRNOTAVAIL):绑定了本机没有的 IP。
- 10050 (WSAENETDOWN):网络子系统挂了,网卡被禁用或者驱动异常。
- 10051 (WSAENETUNREACH):网络不可达,路由缺失,常见于网关配错。
- 10053 (WSAECONNABORTED):连接被本机软件中止,通常是超时机制触发。
- 10054 (WSAECONNRESET):对端强制关闭连接。被防火墙 RST、服务崩溃都会出现。
- 10060 (WSAETIMEDOUT):连接超时。目标地址不通,或者被丢包。
- 10061 (WSAECONNREFUSED):连接被拒绝。端口没人监听,服务没起来。
- 11001 (WSAHOST_NOT_FOUND):域名解析失败,DNS 出问题。
Linux 下对应的是 ECONNREFUSED、ETIMEDOUT、ECONNRESET、EADDRINUSE,语义一样,只是没有数字前缀。
二、按这个顺序排查
1. 先确认服务在不在
netstat -ano | findstr :8080
ss -lntp | grep 8080
没有输出说明端口没人监听,10061 就说得通了。先看服务进程是不是根本没启动。
2. 域名能不能解析
nslookup example.com
ping example.com
返回 11001 就在这里解决:换 DNS,检查 hosts 文件,看有没有代理软件劫持了解析。
3. 网络通不通
ping 目标IP
tracert 目标IP
telnet 目标IP 端口
ping 通但 telnet 不通,说明中间有防火墙拦了端口。ping 都不通,先看本机网卡、网关、路由。
4. 本地防火墙和代理
Windows 防火墙、第三方安全软件、公司上网行为管理设备都可能直接 RST 连接,表现就是 10054 或 10060。关掉代理试试,或者在防火墙里放行程序。
5. 服务端自己看日志
客户端报连接被重置,服务端可能同时段有异常日志。也可能是服务端 backlog 满了,来不及 accept,新连接直接被拒。
三、几种特别容易误判的情况
- 能 ping 通但访问不了:ICMP 和 TCP 是两回事,中间设备可以只放通 ICMP。别用 ping 判断端口是否可用。
- 本机能访问,别人访问不了:服务只监听在 127.0.0.1,没监听 0.0.0.0。
- 偶尔报错,重试就好:连接池里的空闲连接被防火墙超时断开,客户端拿到死连接去发请求就会 10054。要么调大 keepalive,要么做重试。
- 内网正常,外网不通:NAT 映射没配,或者云服务器安全组没放行。
- HTTPS 报 socket error:可能是 TLS 握手失败,证书过期、协议版本不匹配都会表现成断连。
四、写代码时的防御
连接类异常一定要区分处理。ECONNREFUSED 重试没意义,服务没起来;ETIMEDOUT 可以退避重试;ECONNRESET 要重建连接。统一捕获 Exception 然后无脑重试反而会放大故障。
另外记得设超时。socket 默认超时可能是无限,服务端不响应时线程会一直挂着,几个请求就能把连接池占满。