Как я могу решить проблему блокировки клиентской части в сокете TCP в python? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть клиент Python TCP, который делает запрос к серверу TCP в C ++. У меня нет доступа к серверу, поэтому я не могу изменить код на серверной части. Проблема в том, что иногда запрос, сделанный клиентом, не получает никаких данных серверной части, поэтому программа блокируется в строке data = sock.recv(1024). Поэтому мне интересно, как я могу решить эту проблему. Я попытался поставить условную строку после этой строки, если не получены данные, но я не могу пройти строку data = sock.recv(1024).

try:
    data = sock.recv(12)  # this always gets data, it is a message send by the server that verifies the connection is alright
    print("Received: ", ":".join("{:02x}".format(c) for c in data))
    data = sock.recv(1024) 
    print("Received: ", ":".join("{:02x}".format(c) for c in data))
except IOError as e:
    pass

1 Ответ

0 голосов
/ 02 апреля 2019

Вам необходимо установить тайм-аут для операций блокировки, используя socket.settimeout(N) или socket.setdefaulttimeout(N).Таким образом, операция не будет выполнена через N секунд, если данные не будут получены.

Второй вариант - работать с неблокирующим вводом-выводом .

...