python - select.select() 没有捕捉到套接字上的异常情况?

标签 python sockets select

Python 2.7,Windows XP。我有一个向客户端发送消息的服务器。我使用 select 模块来检查准备接收的套接字,以及捕捉异常情况。我的印象是,如果客户端关闭了一个套接字,select() 会在异常情况的套接字列表中返回所述套接字,但它似乎并没有这样做:

lin, lout, lex = select.select(socklist, socklist, socklist)
for sock in lin: 
    # handle incoming messages
for sock in lout: 
    # send updates
for sock in lex: 
    # shut down server-side objects for particular client

服务器确定客户端是否仍然连接的最佳方式是什么?服务器并不总是发送数据,所以我不想依赖 socket.send() 来测试客户端是否仍然存在。

最佳答案

关闭的套接字不是异常(错误)条件。将发生的是套接字将在读取列表 (lin) 中,当您读取时,您将获得 0 字节。这意味着另一端已关闭套接字。

更新:

在正常情况下,您永远不会在异常(exception)列表中看到任何内容,可以安全地忽略它。它用于很少使用的东西,例如带外 (OOB) 等。

问题更新的答案:

可靠且快速地检测到 socket 的另一端已经消失可能很棘手。如果可靠、始终和及时地检测它很重要,那么您应该使用更高级别的机制,例如 keepalive/heartbeat。

如果客户端干净地关闭套接字,那么您应该在读取列表中看到该套接字。从套接字读取将返回 0 字节,这表明套接字已关闭 (EOF)。

关于python - select.select() 没有捕捉到套接字上的异常情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5466137/

相关文章:

python - psycopg2 每次执行都会产生不同的表和游标不滚动到开头

python - 将 pandas 日期时间转换为从开始算起的小时数

linux - 如何为套接字或 epoll 事件分配上下文

c# - 在 C# 中使用 OLEDB 从 Excel 中选择单元格地址

python - 如何将列表列表打印为合理的表格格式

python - 如何使用rpy2的bioconductor?

python - 从 zmq.error.ZMQError : Address already in use 恢复

c++ - 通过 sleep 控制吞吐量

c++ - 如何聚焦或选择一个项目?

sql - 如何从 Oracle 中的值列表中进行选择