socket 怎么知道是否已经四次挥手了

socket 怎么知道是否已经四次挥手了

对应 server-client 的结构,server 往往会在 client 长时间不发消息后主动关闭连接,比如 Mysql 的 wait_timeoutinteractive_timeout 等等参数。

除了 Mysql 还有 RabbitMQ、redis、memcached 等等 server 程序都会这么做。

那请问我在编写客户端的业务代码(!!!)的时候,怎么保证连接可用呢?

  • 方案一: 随便发一个东西,比如 Mysql 的 select version() ;redis 的 ping
  • 方案二:不管,直接用,直到抛出 Timeout 错误异常

我感觉两个方案都不好。

第一个方案,每个 curd 操作都要提前执行 Mysql 的 select version() ;redis 的 ping 等操作,这很浪费时间

方案二的话,捕捉异常和重试的代码会让一切看起来很糟糕,有代码洁癖不能忍

我觉得更加合理的方式是直接判断 client_socket_connection.is_close() ,这个操作应该是直接问本地的操作系统:这个 socket 是不是被四次挥手了呀???

但是我发现 Python 貌似没有提供这个功能(即:直接问本地的操作系统:这个 socket 是不是被四次挥手了呀???)

参考:socket --- 底层网络接口

不知道其他语言有没有?

只考虑四次挥手的情况,不考虑网线被人剪短等网络不可达的情况


回答:

你不需要保证连接可用,也无法保证连接可用。就算有is_close()可以供你调用,也只是保证了当前这一刻socket是活的,它不能保证下一刻你使用该socket发送数据的时候网络依然正常。正确的做法是捕捉异常并编写相关代码。


回答:

参考连接池的普遍做法,通过定时任务发送某个命令如select 1,异步的检查连接是否可用,在保证性能的基础上尽可能保证连接可用。如果运气不好还是碰上了不可用的连接,就重连或者换其他已经建立的连接

以上是 socket 怎么知道是否已经四次挥手了 的全部内容, 来源链接: utcz.com/p/938274.html

回到顶部