服务端怎么知道客户端是否断开网络连接了?

发布于 2022-09-13 01:26:28 字数 376 浏览 30 评论 0

假设我开了一个客户端链接 mysql server (假设客户端在西部,服务器在东部,相隔几千公里),但是我直接一个 kill -9 杀死了这个客户端,此时 mysql server 会知道客户端死了吗?还是说要等到 timeout 时间才行?kill -9 杀死进程的时候,会用四次挥手告诉 mysql server

再假设是默认的 kill 命令呢?

再假设是客户端机器直接一瞬间炸毁了,mysql server 可以知道断开链接了吗?还是说要等到 timeout 超时?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

深者入戏 2022-09-20 01:26:28

断网肯定是没法发数据的,服务端会有超时关闭进程。
另外两种情况实际操作一下,就知道了。

exit:
image.png

kill:

image.png

煞人兵器 2022-09-20 01:26:28

先跟你讨论网络正常的情况下:

这个时候如果你 kill -9 杀死了客户端进程,服务端是能够被通知到断开连接的。

不加 -9 也肯定也行了,你都能自己在退出时通知服务端。

网络不正常的情况下:

服务端是无法被通知到的,这也是数据库死锁的来源之一,如果你的客户端进程还在,开启了一个事物,这时你的客户端网络突然断开了,服务端是收不到通知的,就形成了死锁,你可以自己测试一下,客户端开启事务,然后关闭wifi。

你自己的写的 socket 服务同理。

客户端机器炸毁的情况结局就是在问进程网络还在不在,谁先谁后。

最保险的方式

最保险的方式,还是你自己使用心跳包的方式检测活动。

赤濁 2022-09-20 01:26:28

通常的做法是:

  1. 做好基本的断开处理,即正常关闭(fin)的处理
  2. 可以开启 tcp keepalive,增加一些心跳
  3. 做应用层心跳探测,处理连接异常关闭

有3可以不用2了,双重保障才稳妥

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文