Golang 中国

以下是问题代码段:

if n, err := io.ReadFull(conn, bufMsgLen); err != nil {
       return nil, err
}

问题描述:

服务刚开始运行的好好的,过几天后,ReadFull就不接收数据了,只有客户端关闭连接后,ReadFull才可以收到EOF。

请大牛们给个解题方向,谢谢!


gao88 于 2018-03-03 04:04 修改
2 回复
heimeil
#1 heimeil • 2018-03-03 14:56

func ReadFull(r Reader, buf []byte) (n int, err error)

ReadFull读取会有两种返回情况:

  1. 读满了buf
  2. 读到EOF

你要debug这几种情况:

  1. buf是否在其他地方被修改,导致无法读满buf
  2. 客户端是否正确的发送了数据

另外能收到EOF,说明连接是通的。

bigbear
#2 bigbear • 2018-03-06 14:10

应该是跟Reader的实现有关, ReadFull的第一参数只是一个接口io.Reader, 如果你读的是网络请求通常实现是net.Conn接口的Read方法, 如果Conn实现没有设置超时时间,会导致ReadFull方法长时间等待.
// Read reads data from the connection.
// Read can be made to time out and return an Error with Timeout() == true
// after a fixed time limit; see SetDeadline and SetReadDeadline.
Read(b []byte) (n int, err error)

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。