我正在使用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())
,但似乎仍然没有用。所以我想知道默认的TCP超时是什么,以及如何设置它?
我还使用了netstat -n
并在杀死客户端后获得了以下结果:
tcp4 0 0 127.0.0.1.12345 127.0.0.1.57296 CLOSE_WAIT
CLOSE_WAIT
是什么意思?
答案 0 :(得分:6)
SetReadDeadline
使用AFAIK,但SetReadDeadline(time.Now())
没有合理用途,我相信这就是问题所在。要使超时,例如N秒从现在开始,请使用:
SetReadDeadline(time.Now().Add(N*time.Second))
关闭等待
(服务器和客户端)表示等待来自本地用户的连接终止请求。