我正在实现一个小型TCP服务器.我怎么知道我的一个客户是否关门了?我应该试着读或写,然后判断err是否为零吗?

推荐答案

线程"utils/ping.go158/http://osdir.com/ml/go-language-discuss/2012-08/msg01586.html" rel="noreferrer">Best way to reliably detect that a TCP connection is closed",使用net.Conn表示"c"(也可以在utils/ping.golocale-backend/server.gomany other instances中看到):

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个提到in the comments个:

在GO 1.7+中,零字节读取会立即返回,并且永远不会返回错误.
您必须至少读取一个字节.

commit 5bcdd63go issue 15735

net: don't return io.EOF from zero byte reads

Go相关问答推荐

Go Net/http路由

如何在GoFr中为生产和本地环境设置不同的配置?

Go Colly-访问for循环中的URL

JetBrains Goland,禁用突出显示测试文件

Makefilego version和read命令

GORM:一个表的两个外键

如何在gofiber/websocket/v2中设置状态代码和原因

Golang Gorm Fiber / argon2.Config 未定义

从带有嵌套括号的字符串中提取值

在VSCode中如何使用特定的文件名提供编译命令

Golang代码判断第一个词是否可以从第二个词形成

如何在模板中传递和访问 struct 片段和 struct

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

CBC Decrypter 解密加密文本,但部分文本被随机字符替换

如何使用 go-playground/validator 编写 snake case 绑定标签?

Gorm 在保存/创建时序列化 struct

Golang 使用 docker 将敏感数据作为参数传递

将未知长度切片的值分配给Go中的 struct ?

泛型:对具有返回自身的函数的类型的约束

是否存在一个Go泛型类型约束,该约束捕获了将类型用作映射中的键的能力?