【问题标题】:How to correctly use select.select() with someSocket.recv如何正确使用 select.select() 和 someSocket.recv
【发布时间】:2020-07-02 17:09:34
【问题描述】:

这是打印“已收到”:

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

这是打印“超时”:

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 上运行它。

【问题讨论】:

    标签: python sockets recv


    【解决方案1】:
    readable, writeable, exceptional = select.select([mysocket], [], [], 5)
    if mysocket in readable:
      data = connection.recv(256)
    

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

    【讨论】:

      猜你喜欢
      • 2016-03-10
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2023-04-03
      • 2018-12-04
      • 2015-09-23
      • 2018-03-22
      相关资源
      最近更新 更多