python - 套接字失去连接

标签 python sockets

我知道 Twisted 可以很好地做到这一点,但是普通套接字呢?

您如何判断您是否随机丢失了套接字中的连接?就像,如果我的互联网断了一会儿又回来了。

最佳答案

我假设您在谈论 TCP。

如果您的互联网连接中断一秒钟,您可能根本不会丢失 TCP 连接,它只会重新传输并恢复操作。

当然还有 100 多种其他原因可能会导致您失去连接(例如,中间的 NAT 网关决定悄悄地断开连接。另一端被核弹击中。您的路由器烧毁了。另一端的人猛拉出来他的网线等等等等)

如果你需要检测死节点/关闭的套接字等,你应该这样做:

  • 从套接字读取或以任何其他方式等待其上的传入数据事件。这允许您检测连接何时正常关闭,或发生错误(读取它返回 0 或 -1)- 至少如果另一端仍然能够向您的主机发送 TCP FIN/RST 或 ICMP 数据包.

  • 写入套接字 - 例如每 N 秒发送一些心跳。当另一端静默失败时,仅从套接字读取不会检测到问题。如果那台 PC 掉线了,它显然不能告诉你它掉线了 - 所以你必须给它发送一些东西,看看它是否有响应。

  • 如果您不想每 N 秒写一次心跳,您至少可以打开 TCP keepalive - 如果对等方已死,您最终会收到通知。您仍然需要从套接字中读取,默认情况下,keepalive 通常每 2 小时发送一次。不过,这仍然比将死套接字保留数月要好。

关于python - 套接字失去连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2697989/

相关文章:

Java 客户端服务器应用程序 - 地址已在使用 : connect

java SocketException : Connection reset

python - 导入特定于版本的 python 模块的最佳方法

python - Django:模型类 X 未声明显式 app_label 并且也不在 INSTALLED_APPS 的应用程序中

python - 如何记录 Python 程序执行的 CPU 指令?

python - 如何单击“查看更多”链接并通过 Selenium 和 Python 抓取内容

java - Spring Integration - 如何通过同一连接实现异步 TCP 套接字请求/响应?

python - 无法连接到本地主机python

c - 在 UNIX 域套接字上设置 connect() 超时

python - Python 中递归函数中的计数器不会通过 Print 生成输出(使用 Netbeans)