如何正确使用 select.select() 和 someSocket.recv

How to correctly use select.select() with someSocket.recv

正在打印 "Received":

connection, clientAddr = mysocket.accept()
data = connection.recv(256)
print("Received")

正在打印 "Timed out":

connection, clientAddr = mysocket.accept()
mysocket.setblocking(0)

readable, writeable, exceptional = select.select([mysocket], [], [], 5)
if mysocket in readable:
  data = connection.recv(256)
  print("Received")
else:
  print("Timed out")

问题不在于5秒太短,数据在5秒内在第一个代码块中被接收。 我尝试删除行 mysocket.setblocking(0),没有任何变化。 我尝试将 if mysocket in readable: 更改为 if readable: 并且也做了 print(readable),仍然超时并打印输出,“[]”。

编辑:我也尝试在 else 块中使用 mysocket.recv(256),它收到了数据。

我 运行 这个 Linux。

readable, writeable, exceptional = select.select([mysocket], [], [], 5)
if mysocket in readable:
  data = connection.recv(256)

您在 mysocket(侦听器套接字)中执行 select,如果 select 发出可用数据信号,您将在 connection(连接套接字)上进行读取。如果您想知道是否可以从中读取,您应该在 connection 上执行 select。如果您想知道是否可以调用 accept 来获得另一个客户端连接,则应该在 mysocket 上执行 select。