2

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
  }
}

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

我也尝试过conn.SetReadDeadline(time.Now()),但似乎仍然无法正常工作。所以我想知道 go 中默认的 TCP 超时是多少,我该如何设置呢?

netstat -n在杀死客户端后,我也使用并得到了以下结果:

tcp4 0 0 127.0.0.1.12345 127.0.0.1.57296 CLOSE_WAIT

是什么CLOSE_WAIT意思?

4

1 回答 1

6

SetReadDeadline可以使用 AFAIK,但SetReadDeadline(time.Now())没有合理的用途,我相信这就是问题所在。例如,要从现在开始超时 N 秒,请使用:

SetReadDeadline(time.Now().Add(N*time.Second))

来自维基百科

关闭等待

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

于 2013-04-12T12:21:24.957 回答