2013-04-12 89 views
2

我正在使用net.Listen()来侦听来自客户端的TCP连接。去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意思?

回答

5

SetReadDeadline作品AFAIK,但SetReadDeadline(time.Now())没有合理的用途,这是我的问题。从现在使用作出的超时,例如N秒

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

Wikipedia

CLOSE-WAIT

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

+0

尝试过,但现在的工作... –

+1

@ReckHou:这很难帮助没有完整的,可编译的和最小的代码要么重现STDLIB错误或看,并试图找到你的一个错误。我似乎记得使用截止日期,他们为我工作的IIRC。 – zzzz