我是Golang的新手 .
我正在实现一个小型TCP服务器,如何知道我的一个客户是否已关闭?我应该尝试阅读或写入并检查错误是否为零?
那个帖子“Best way to reliably detect that a TCP connection is closed”,使用 net.Conn 代表' c '(也见于utils/ping.go或locale-backend/server.go或many other instances):
net.Conn
c
one := []byte{} c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id) c.Close() c = nil } else { var zero time.Time c.SetReadDeadline(time.Now().Add(10 * time.Millisecond)) }
为了检测超时,它建议:
if neterr, ok := err.(net.Error); ok && neterr.Timeout() { ...
只是尝试从它读取,如果它关闭它将抛出一个错误 . 如果你愿意,可以优雅地处理!
为了放弃过多的风险:
func Read(c *net.Conn, buffer []byte) bool { bytesRead, err := c.Read(buffer) if err != nil { c.Close() log.Println(err) return false } log.Println("Read ", bytesRead, " bytes") return true }
以下是使用net包制作小型TCP“聊天服务器”的一个很好的介绍:
“Golang Away: TCP Chat Server”
_, err := conn.Read(make([]byte, 0)) if err!=io.EOF{ // this connection is invalid logger.W("conn closed....",err) }else{ byt, _:= ioutil.ReadAll(conn); }
3 回答
那个帖子“Best way to reliably detect that a TCP connection is closed”,使用
net.Conn
代表'c
'(也见于utils/ping.go或locale-backend/server.go或many other instances):为了检测超时,它建议:
只是尝试从它读取,如果它关闭它将抛出一个错误 . 如果你愿意,可以优雅地处理!
为了放弃过多的风险:
以下是使用net包制作小型TCP“聊天服务器”的一个很好的介绍:
“Golang Away: TCP Chat Server”