Python;通过 select 控制死套接字时出现问题

2023-12-02

我有一些代码将连接到主机,除了监听传入数据之外什么都不做,直到客户端关闭或主机发送关闭语句。为此,我的代码运行良好。

然而,当主机在没有发送关闭语句的情况下死亡时,我的客户端将按照预期永久监听传入数据。为了解决这个问题,我每隔 foo 秒设置一次套接字超时,并开始检查连接是否处于活动状态。来自Pythonsocket我如何找到这个:

select 的一个非常令人讨厌的问题:如果这些套接字输入列表中的某个位置已经严重死亡,那么 select 将失败。然后,您需要循环遍历所有这些列表中的每个该死的套接字并执行 select([sock],[],[],0) 直到找到坏的套接字。超时为 0 意味着不会花很长时间,但它很丑陋。

    # Example code written for this question.
    from select import select
    from socket include socket, AF_INET, SOCK_STREAM

    socket = socket(AF_INET, SOCK_STREAM)
    socket.connect(('localhost', 12345))
    socklist = [socket,]
    attempts = 0

    def check_socklist(socks):
        for sock in socklist:
            (r, w, e) = select([sock,], [], [], 0)          

            ...
            ...
            ...

    while True:

        (r, w, e) = select(socklist, [], [], 60)

        for sock in r:      
            if sock is socket:
                msg = sock.recv(4096)
                if not msg:
                    attempts +=1
                    if attempts >= 10:
                        check_socket(socklist)
                    break
                else:
                    attempts = 0
                    print msg

本文提出了三个问题。

  1. 我被告知要检查连接是否处于活动状态,必须写入套接字并查看响应是否返回。如果没有,则必须假定连接已断开。在文本中,它说要检查是否有坏连接,请单独列出每个套接字,将其传递给 select 的第一个参数并将超时设置为零。这将如何确认套接字是否已死亡?
  2. 为什么不通过尝试写入套接字来测试套接字是死是活?
  3. 当连接处于活动状态和断开状态时我要寻找什么? select 会立即超时,因此没有数据就证明不了什么。

我意识到有像这样的图书馆gevent, asyncore and twisted这可以帮助我,但我选择自己做这件事,以便更好地了解正在发生的事情,并更好地控制自己的来源。


如果连接的客户端崩溃或退出,但其主机操作系统和计算机仍在运行,则其操作系统的 TCP 堆栈将向您的服务器发送 FIN 数据包,让您计算机的 TCP 堆栈知道 TCP 连接已关闭。您的 Python 应用程序会将其视为 select() ,表明客户端的套接字已准备好读取,然后当您在套接字上调用 recv() 时,recv() 将返回 0。当发生这种情况时,您应该通过关闭来响应插座。

另一方面,如果连接的客户端计算机永远没有机会发送 FIN 数据包(例如,因为有人伸手将其以太网线或电源线从插座中拔出),那么您的服务器将不会意识到 TCP 连接已经不存在很长一段时间了——可能永远不存在了。避免出现“僵尸套接字”的最简单方法就是让服务器经常在套接字上发送一些虚拟数据,例如每分钟一次或类似的东西。客户端应该知道丢弃虚拟数据。发送虚拟数据的好处是,服务器的 TCP 堆栈会注意到它没有收到任何发送的数据包的 ACK 数据包,并将重新发送它们;重新发送几次后,您的服务器的 TCP 堆栈将放弃并确定连接已断开,此时您将看到我在第一段中描述的相同行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python;通过 select 控制死套接字时出现问题 的相关文章

随机推荐

  • numpy向量化函数以接受不同长度的向量并返回张量结果

    我想向量化一个函数f a b 这样 当我输入 a 和 b 作为两个向量时 就会返回组合的张量 这是一个说明性示例 import numpy as np def tester a b mysumm 0 for ii in range a fo
  • jQuery AutoComplete 触发更改事件

    如何以编程方式触发 jQuery UI 的 AutoComplete 更改事件处理程序 Hookup CompanyList autocomplete source context companies change handleCompan
  • 在后台使用 onSaveInstanceState 和片段?

    我将片段保留在 FragmentManager 的后台堆栈中 每个片段状态都保存为成员变量的方向更改 例如 Override public void onSaveInstanceState Bundle outState super onS
  • 套接字连接突然关闭,代码为 141

    我想做的是连接到远程服务器 从本地计算机上的文件中读取内容并将其发送到服务器 然后捕获服务器响应并保存 我将 GET 命令放入一个文本文件中 并尝试获取相同的结果 这是代码的一部分 我使用套接字和 C 来完成此操作 if inet pton
  • jQuery 粘性页脚

    詹姆斯来了 我已经尝试了大约两个小时来获得粘性页脚 但我似乎一直搞乱 CSS 我正在寻找 jQuery 可以处理的脚本 我了解大多数脚本的工作原理 这很令人惊讶 因为我刚刚学习 但无论页脚的高度是多少 我都需要脚本工作 因为它没有在我的页面
  • 下单成功后如何获取可下载的产品链接

    成功订购后 我想直接建议买家在 success phtml 文件中购买的产品的可下载 URL 我写了这段代码来了解最新订单的产品值 Get the latest Order ID order Mage getModel sales orde
  • 如何使用 Hive 确定 HDFS 中的文件大小

    我正在使用的工作区设置为 Hive 1 1 0 和 CDH 5 5 4 我进行了一个查询 得到了 22 个分区的结果 保存在此分区目录中的文件始终是唯一的 大小从 20MB 到 700MB 不等 据我了解 这与查询过程中使用的reducer
  • ! LaTeX 错误:环境三部分表未定义

    使用 R Markdown 创建 pdf 时出现此错误 output file NCERA 210 Results knit md LaTeX Error Environment threeparttable undefined Error
  • 如何在asp.net中20分钟后停止会话超时?

    我正在使用 iis6 来部署我的应用程序 无论我如何更改iis配置中的超时或添加一个global asax文件来设置Session Timeout 甚至使用sessionstate 我仍然在20分钟后得到会话超时 这太疯狂了 有人请帮助我吗
  • 关于复制构造函数的问题

    我有这门课 class A private int player public A int initPlayer 0 A const A A operator const A A void foo const 我有包含这一行的函数 A pa
  • 调用本机方法时 JVM 必须做什么?

    当调用声明为的 Java 方法时 JVM 运行时必须执行哪些通常步骤native HotSpot 1 8 0 JVM 如何实现 JNI 函数调用 涉及哪些检查步骤 例如返回后未处理的异常 JVM 要执行哪些簿记 例如本地引用注册表 以及调用
  • 从列表中查找最旧的文件

    我有一个文件 其中包含不同目录中的文件列表 并且想要找到最旧的文件 感觉用一些 shell 脚本应该很容易 但我不知道如何解决这个问题 我确信在 Perl 和其他脚本语言中这确实很容易 但我真的很想知道我是否错过了一些明显的 bash 解决
  • WPF 自定义命名空间不起作用[重复]

    这个问题在这里已经有答案了 我遵循这个代码项目中的指南 因此 我将其添加到 AssemblyInfo cs 中 assembly XmlnsPrefix http my project com wpf g assembly XmlnsDef
  • 测试框架意外退出 - 空手道测试

    我将一个空手道项目导入到我的 Intellij 中 我已经把maven清理干净了 当我运行它时 我收到消息 测试框架意外退出并出现以下错误 Testing started at 10 24 C Users oluseyiojo Downlo
  • Vue 3 Vite-动态图片src

    我正在使用 Vue 3 和 Vite 在 Vite 构建生产后 我遇到了动态 img src 的问题 对于静态 img src 没有问题 img src src assets images my image png alt Image cl
  • 如何强制 MockitoJUnitRunner 在没有基本 http 身份验证的情况下失败?

    我写一个Spring Boot应用程序 我能够访问和测试Controller with MockMvc 问题是在测试期间没有强制执行安全性 我可以访问Controller没有用户 我做错了什么吗 这是有意的行为吗 ControllerTes
  • 将 XRAY 跟踪添加到非休息功能,例如 SQS、Cognito 触发器等

    使用无服务器框架 我有未附加到 API 网关端点的函数 例如 认知触发器 S3 Event DynamoDB 流 SQS活动 我还使用 XRAY 追踪 我将其设置为tracing true在我的 serverless yml 文件中 看来这
  • Woocommerce API 认为图像 SRC 是一种不同类型的文件,而不是 JPG

    Example images gt array 6 0 gt array 2 src gt string 112 https nz tradevine com BlobStorage GetFullPhoto photoID 3783754
  • 在 livebindings CustomFormat 中使用 Format

    我正在尝试使用 LiveBindings 来格式化数字以在 FireMonkey 表单上的 TEdit 中显示 我正在尝试使用绑定的 CustomFormat 中的 Format 方法来格式化具有两位小数的数字 我可以对输出进行 硬编码 F
  • Python;通过 select 控制死套接字时出现问题

    我有一些代码将连接到主机 除了监听传入数据之外什么都不做 直到客户端关闭或主机发送关闭语句 为此 我的代码运行良好 然而 当主机在没有发送关闭语句的情况下死亡时 我的客户端将按照预期永久监听传入数据 为了解决这个问题 我每隔 foo 秒设置