python - 当网络套接字始终准备好读取时如何使用 select?

标签 python sockets select

我像这样使用选择:

while True:
    readReady, _, _ = select.select([src, dst], [], [])
    for ready in readReady:
        if ready == dst:
            toRead = dst
            toWrite = src
        else:
            toRead = src
            toWrite = dst

        toWrite.sendall(toRead.recv(10))

在发送所有数据之前,toWrite 是否阻塞并不重要。但问题是 select 立即返回,因为套接字已准备好读取,但没有数据。我如何等到真正有一些数据为止?

另外,print(toRead.recv(10))打印b'',它是空的(虽然我期望select阻止) 。套接字处于阻塞模式。

最佳答案

这是select API的一部分:如果select调用返回一个可读的套接字,则必须对其调用recv(),否则每次后续的 select 调用都会返回此套接字,因为该套接字仍然可读。

如果您 recv() 没有收到任何数据,则表明套接字已关闭。

关于python - 当网络套接字始终准备好读取时如何使用 select?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19410651/

相关文章:

python - Tensorflow 图节点是交换的

html - 单击 ,选择并克隆到另一个字段

python - 如何获取UnicodeDecodeError发生的位置?

python - 如何用Python将用户输入转换为列表?

php - 无法从PHP代码连接到unix :///var/run/docker. socks (权限被拒绝)

Android 处理程序 bufferedreader.read() 在接收数据时关闭应用程序

php - Zend_Db_选择 : Working with JOIN's

html - Angularjs 选择对象的 ng-model 绑定(bind)

python - 使用 Python 备份 Postgresql 数据库

ios - iOS 中的 Apple 推送通知 (APN) 服务服务器端 Python 2 脚本