Go 解决"Connection reset by peer"或"EOF"问题
吃一堑消化不良 · · 19862 次点击 · · 开始浏览【问题】
我编写了一个http Client程序代码如下:
// create a request
req, err := http.NewRequest(method, url, body)
if err != nil {
return nil, err
}
// send JSON to firebase
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Bad HTTP Response: %v", resp.Status)
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
多次发给服务器后,几乎每次都会出现下面的错误:
ERROR 10108 socket.cpp:985 0x7fffe81426e0 recvmsg(62, 1): (104, "Connection reset by peer")
WARN 10108 server.cpp:467 0x7fffe80abd60-2 Unexpected SocketException
【原因】
在解决问题之前需要了解关于go是如何实现connection的一些背景小知识:有两个协程,一个用于读,一个用于写(就是readLoop和writeLoop)。在大多数情况下,readLoop会检测socket是否关闭,并适时关闭connection。如果一个新请求在readLoop检测到关闭之前就到来了,那么就会产生EOF错误并中断执行,而不是去关闭前一个请求。这里也是如此,我执行时建立一个新的连接,这段程序执行完成后退出,再次打开执行时服务器并不知道我已经关闭了连接,所以提示连接被重置;如果我不退出程序而使用for循环多次发送时,旧连接未关闭,新连接却到来,会报EOF。
【解决】
对 req 增加属性设置:
req.Close = true
它会阻止连接被重用,可以有效的防止这个问题,也就是Http的短连接
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
【问题】
我编写了一个http Client程序代码如下:
// create a request
req, err := http.NewRequest(method, url, body)
if err != nil {
return nil, err
}
// send JSON to firebase
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Bad HTTP Response: %v", resp.Status)
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
多次发给服务器后,几乎每次都会出现下面的错误:
ERROR 10108 socket.cpp:985 0x7fffe81426e0 recvmsg(62, 1): (104, "Connection reset by peer")
WARN 10108 server.cpp:467 0x7fffe80abd60-2 Unexpected SocketException
【原因】
在解决问题之前需要了解关于go是如何实现connection的一些背景小知识:有两个协程,一个用于读,一个用于写(就是readLoop和writeLoop)。在大多数情况下,readLoop会检测socket是否关闭,并适时关闭connection。如果一个新请求在readLoop检测到关闭之前就到来了,那么就会产生EOF错误并中断执行,而不是去关闭前一个请求。这里也是如此,我执行时建立一个新的连接,这段程序执行完成后退出,再次打开执行时服务器并不知道我已经关闭了连接,所以提示连接被重置;如果我不退出程序而使用for循环多次发送时,旧连接未关闭,新连接却到来,会报EOF。
【解决】
对 req 增加属性设置:
req.Close = true
它会阻止连接被重用,可以有效的防止这个问题,也就是Http的短连接