【问题标题】:Go TCP timeout not working?Go TCP 超时不起作用?
【发布时间】:2013-04-04 23:05:02
【问题描述】:

我正在使用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 是什么意思?

【问题讨论】:

    标签: tcp timeout go


    【解决方案1】:

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

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

    来自Wikipedia

    关闭等待

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

    【讨论】:

    • @ReckHou:没有完整的、可编译的和最少的代码来重现 stdlib 错误或查看并尝试找到您的错误是很难的。我似乎记得使用截止日期,他们为我工作了 IIRC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2017-08-07
    • 2018-12-27
    • 2012-05-15
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多