Как мне обрабатывать сокеты, которые читаются, но ничего не recv? - PullRequest
0 голосов
/ 14 апреля 2020

Недавно я писал http / https прокси с использованием сокета на python, и я использую select, чтобы решить, готов ли сокет для получения или отправки, что-то вроде этого:

inputs = [sock1, sock2...]
outputs = [sock1, sock2...]
while True:
    readable, writable, exceptional = select.select(inputs, outputs, inputs)
    for s in readable:
        do something with s.recv()
    for s in writable:
        do something with s.send()

и я замечаю, что иногда сокет читается, но когда я выполняю s.recv (), он возвращается пустым. И так как у меня есть некоторое время True l oop снаружи, так что он ничего не получает снова и снова. Сначала я попытался закрыть сокет:

data = s.recv(4096) 
if not data:
    inputs.remove(s)
    s.close()

, но через некоторое время какой-то сокет оживает, и они не могут отправить мне сообщение, потому что я уже закрыл его. Значит ли это, что я не должен закрывать это? Так что мне с этим делать?

1 Ответ

1 голос
/ 14 апреля 2020

Когда сокет в списке приема возвращает нулевые байты на recv, это означает, что сокет был закрыт с другой стороны. Он никогда не получит данные снова и должен быть отключен и закрыт также на вашей стороне.

Вы, скорее всего, «какой-то сокет оживает» - это не сокет на другой стороне этого соединения, который уже отключен.

...