блоки сокетов python TCP по методу recv - PullRequest
2 голосов
/ 19 марта 2012

В настоящее время я пытаюсь пройти базовое руководство по работе в сети, и я заметил, что элементарная клиент-серверная программа зависает при попытке сервера прочитать больше данных от клиента, когда все данные будут получены.В основном код выглядит следующим образом:

def recv_all(sock,length):
    data=''
    while len(data)<length:
        more=sock.recv(length-len(data))
        if not more :
            raise EOFError('socket inchis %d octeti intr-un mesaj de %d octeti'%(len(data),length))
        data+=more
    return data

Эта функция вызывается как с клиента, так и с сервера, но сервер сначала использует ее для обработки клиентского запроса.Все идет хорошо до второго вызова sock.recv, когда сообщение с запросом получено.

Вместо того, чтобы переходить к следующей строке (с большим числом 0), отладчик просто зависает там, и я понятия не имею, с чем это может быть связано.актуален в любом случае.Любая помощь будет оценена, спасибо

1 Ответ

3 голосов
/ 19 мая 2012

Как уже отмечали другие, причина в том, что сокеты блокируются по умолчанию.Это означает, что функция recv будет блокировать выполнение программы, пока не поступят некоторые данные.Если ничего не изменится, программа будет ждать вечно или пока сервер не разорвет соединение.

Одним из решений является переключение на неблокирующие сокеты, используя функцию settimeout, например, sock.settimeout(2).Это означает, что если ничего не получено в течение 2 секунд, будет сгенерировано исключение.Вы можете перехватить это исключение и обработать его соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...