Как правильно использовать select.select () с someSocket.recv - PullRequest
0 голосов
/ 21 марта 2020

Это печать «Получено»:

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), все еще истекло время ожидания, и на печать выводится "[]".

Редактировать: Я также попытался использовать mysocket.recv(256) в * Блок 1015 *, он получил данные.

Я запускаю это на Linux.

1 Ответ

2 голосов
/ 22 марта 2020
readable, writeable, exceptional = select.select([mysocket], [], [], 5)
if mysocket in readable:
  data = connection.recv(256)

Вы делаете select in mysocket (гнездо слушателя), и если select сигнализирует о доступных данных, вы читаете connection (соединительный разъем). Вы должны сделать select на connection, если хотите знать, можете ли вы читать с него. Вместо этого следует выбрать mysocket, если вы хотите узнать, можете ли вы позвонить accept для получения другого клиентского соединения.

...