Сокет recv зависает несмотря на settimeout - PullRequest
0 голосов
/ 13 апреля 2020

Я использую встроенный модуль сокетов для создания клиентского сокета.

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
sock.settimeout(30.0)
sock.connect((host, port))
...

def recvall(sock, count):
    buf = io.BytesIO()
    while count:
        newbuf = sock.recv(count)
        buf.write(newbuf)
        count -= len(newbuf)
    return buf.getvalue()

msg = recvall(sock, 1024)

Иногда, несмотря на настройку тайм-аута, вызов recv блокируется навсегда, когда происходит сбой процесса сервера. К сожалению, я не могу создать минимальный пример; мой пример с минимальным сервером имеет правильное поведение.

1 Ответ

0 голосов
/ 13 апреля 2020

Проблема решена комментарием mkrieger1. Вызов recv возвращал пустую строку, вызывая бесконечное l oop.

if not newbuf:
    raise socket.error("no data")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...