在 golang 中,怎么判断一个 socket 连接是否关闭?

2022-07-27 02:22:01 +08:00
 ppolanwind

golang 小白求教

4903 次点击
所在节点    Go 编程语言
26 条回复
neoblackcap
2022-07-27 03:23:08 +08:00
如果你是问标准库里面的 socket 连接,那么是没有直接的判断方式的。唯有你自己写一个。
方法便是设置 socket 连接的读超时,如果连接读取超时则认为是 socket 已经关闭了
1423
2022-07-27 03:26:20 +08:00
err eof 就是关闭啊
Goooooos
2022-07-27 07:50:20 +08:00
系统的 keepalive 或者自己心跳监控
bthulu
2022-07-27 08:09:21 +08:00
服务器响应心跳, 客户端发送心跳, 除此以外的一切判断方法都会出现线路断开了而报正常.
fzdwx
2022-07-27 08:52:41 +08:00
go 没有提供这样的 api ,一般是往里面写,来判断。
aladdinding
2022-07-27 08:56:09 +08:00
对一个已经关闭的连接读写的话通常会 rest by peer 和 broken pipe
djoiwhud
2022-07-27 09:19:03 +08:00
read---->EOF ,已关闭
write---->broken pipe ,已关闭
wangyu17455
2022-07-27 09:39:31 +08:00
读超时设置 0 ,然后直接读,error 就是关了
lysS
2022-07-27 09:55:01 +08:00
如果是系统接口的 socket 本身,它断了,读和写都会报错 closed

如果是物理意义上的通信链路断,就需要加 keepalive 、心跳包
ppolanwind
2022-07-27 10:38:06 +08:00
@wangyu17455 读超时设置 0 是指不设置超时时间吗?
ppolanwind
2022-07-27 10:42:40 +08:00
@bthulu 监控心跳的 socket 和接发数据的 socket 是同一个吗
wangyu17455
2022-07-27 11:55:26 +08:00
@ppolanwind SetReadDeadline(time.Unix(0,0))
haoliang
2022-07-27 12:21:20 +08:00
@lysS > 如果是物理意义上的通信链路断,就需要加 keepalive 、心跳包
链路层(data link layer)断了,连接还能通过 keepalive 、心跳包恢复,第一眼看到时我觉得不可思议,想了下还是觉得不可思议
ppolanwind
2022-07-27 12:31:49 +08:00
@haoliang 可以详细解释一下嘛
ppolanwind
2022-07-27 12:35:01 +08:00
@wangyu17455 这样设置的意思是立即超时?那么接下来的读操作不会直接返回超时 err 嘛?
lysS
2022-07-27 13:36:52 +08:00
@haoliang 不是恢复,是判断链路是否还是通的
stephenxiaxy
2022-07-27 15:27:38 +08:00
借楼问个问题,epoll 里面也是用的 keepalive 来触发的吗
xuyang2
2022-07-27 15:54:19 +08:00
bthulu
2022-07-27 16:00:40 +08:00
@ppolanwind 你要判断这个 socket 是否关闭, 那就只能是这个 socket 的心跳来判断.
wangyu17455
2022-07-27 16:02:29 +08:00
@ppolanwind 这么做的意思是非阻塞读,如果 socket 缓冲区里有东西那就能读到东西,如果没有就直接返回,如果 socket 已经关闭那你调用 read 会得到 error ,调用 SetReadDeadline 是为了防止连接没有关闭然后阻塞在读取上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868923

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX