猿问
如何知道net包中TCP连接是关闭的?
我正在实现一个小型TCP服务器。我怎么知道我的一位客户是否关门?我应该只是尝试读取或写入并检查是否
err
为nil?
慕田峪9158850
浏览 259
回答 2
2回答
慕慕森
该线程“的最佳方式可靠地检测TCP连接被关闭”,使用net.Conn了“ c”(也可见于utils/ping.go或locale-backend/server.go或许多其他情况下):one := make([]byte, 1)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() { ...更新2019:tuxedo25在评论中提到:在Go 1.7+中,零字节读取立即返回,并且永远不会返回错误。您必须至少读取一个字节。参见commit 5bcdd63并执行issue 15735net:不要io.EOF从零字节读取中返回
0
0
0
守着星空守着你
只要尝试从中读取,如果关闭它就会抛出错误。如果您愿意,请优雅地处理!付出太多的风险: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}
0
0
0
随时随地看视频
慕课网APP
相关分类
Go
我要回答