Go 网络处理中的几种错误


之前遇到了很多 timeout,但是仔细看错误提示好像不完全一样,于是就做了个简单的试验:

Client 上看到的错误

找不到服务器(no such host)的几种情况:

# 域名不存在,瞄了下代码,应该是 dns 包返回的
Get http://a.b/abc: dial tcp: lookup a.b: no such host

# ip 不合法不会直接检查,也会返回同样错误
Get http://127.0.0.1888:8080/abc: dial tcp: lookup 127.0.0.1888: no such host

# 端口瞎填会直接报错,都不会发请求
Get http://127.0.0.1:65536/abc: dial tcp: address 65536: invalid port

拒绝连接,对方端口未监听、进程挂掉等等

Get http://127.0.0.1:8080/abc: dial tcp 127.0.0.1:8080: connect: connection refused

建立连接超时

Get http://127.0.0:8080/abc: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

等待返回 header, 一般是接口还在处理逻辑,没有返回任何数据;或者对方只是个普通的 tcp 服务,但不是 http

Get http://127.0.0.1:8080/abc: net/http: request canceled (Client.Timeout exceeded while awaiting headers)

客户端读取超时:已建立好连接,已经开始返回数据,但是body 太大太慢:

wait_test.go:48: net/http: request canceled (Client.Timeout exceeded while reading body)

Server 上看到的错误

客户端主动断开连接,服务器端在调用 Write(p []byte) (n int, err error) 时会返回:

wait_test.go:21: write tcp 127.0.0.1:8080->127.0.0.1:49290: write: broken pipe

客户端主动断开连接,通常会直接使用 ctx.Done() 检测到,这个时候 ctx.Err() 里会拿到这个信息:

context canceled

参考链接:

Avatar
huiren
Code Artisan

问渠那得清如许,为有源头活水来

相关

下一页
上一页
comments powered by Disqus