转TCP超时无效?

Rec*_*Hou 2 timeout tcp go

我正在使用net.Listen()来监听客户端的TCP连接.

当客户端建立连接时,Handler(conn net.Conn)将处理它.

func Handler(conn net.Conn) {

  read_len, err := conn.Read(request)

  if err != nil {
    if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
      fmt.Println(neterr)
      PILOG("Client timeout!", PILOGWARNING)
      conn.Close()
      return
  }
}
Run Code Online (Sandbox Code Playgroud)

我使用测试客户端连接然后突然终止客户端而不发送DISCONNECT消息.我的服务器应该在达到超时时关闭连接,但经过漫长的等待时间后它永远不会发生.

我也尝试过,conn.SetReadDeadline(time.Now())但似乎仍然无法正常工作.所以我想知道默认的TCP超时是什么,以及如何设置它?

netstat -n杀死客户后我也用过并获得了以下结果:

tcp4 0 0 127.0.0.1.12345 127.0.0.1.57296 CLOSE_WAIT

什么CLOSE_WAIT意思?

zzz*_*zzz 6

SetReadDeadlineAFAIK工作,但SetReadDeadline(time.Now())没有合理的用途,我相信这就是问题所在.要使超时,例如从现在起 N秒使用:

SetReadDeadline(time.Now().Add(N*time.Second))
Run Code Online (Sandbox Code Playgroud)

来自维基百科

CLOSE-WAIT

(服务器和客户端)表示等待来自本地用户的连接终止请求.