Ошибка EOF при использовании recv в python - PullRequest
0 голосов
/ 04 июня 2010

Я делаю это в своем коде,

HOST = '192.168.1.3'    
PORT = 50007              
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
query_details = {"page" : page, "query" : query, "type" : type}
s.send(str(query_details))
#data = eval(pickle.loads(s.recv(4096)))
data = s.recv(16384)

Но я постоянно получаю EOF на последней строчке. Код, с которым я отправляю,

self.request.send(pickle.dumps(results))

1 Ответ

8 голосов
/ 04 июня 2010

s.send - это , а не гарантированно отправляет каждый предоставленный вами байт; используйте s.sendall вместо.

Точно так же s.recv - это , а не , гарантированно получит каждый запрашиваемый байт - в этом случае вам нужно узнать другими способами, сколько именно байтов вам нужно получить (например, отправьте сначала длину из строки, которую вы отправляете, закодированной с помощью модуля struct), и вы несете ответственность за выполнение цикла для этой цели. Не существует и не может быть recvall, потому что потоковые сокеты не в любом случае являются "самоограничивающимися" - это просто потоки, разбитые на совершенно произвольные пакеты размеров, не имеющие семантической значимости.

Вы никогда не должны получать EOF от самого recv, хотя, конечно, вы можете ожидать получить его в строке, которую вы закомментировали, от pickle.loads (поскольку его аргумент вполне может быть только часть байтов, отправленных контрагентом: как объяснено в предыдущем абзаце).

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