Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 11, 2014 16:43:37

Virtul
От:
Зарегистрирован: 2012-01-27
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Где read() видит EOF в socket.makefile()?

Объясните, пожалуйста, код ниже получает TCP ответ от сервера на ура:
socket_f = socket.makefile()
data = socket_f.read()

Но, если сервер пришлёт два ответа подряд, в data попадут оба?
И что значит “подряд”? Т.е. в каком случае read() остановится, а в каком продолжит читать? зависит от скорости выполнения?

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

Или так, EOF ставит в стрим сама ОС, когда все tcp сегменты сообщения получены?



Отредактировано Virtul (Авг. 11, 2014 16:52:11)

Офлайн

#2 Авг. 11, 2014 23:15:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Где read() видит EOF в socket.makefile()?

Для анализа можешь использовать netcat. Она может быть как клиентом, так и сервером.

import socket
 
HOST = 'localhost'
PORT = 8000
 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
sock.connect((HOST, PORT))
 
with sock.makefile('rb') as sin:
    for i in sin:
        print(i)

Virtul
Т.е. в каком случае read() остановится
Когда сокет закроется на стороне сервера.

python.org. socket.makefile()

Virtul
Я пытаюсь понять, корректно ли обрабатывать ответы таким вот способом или нужно читать сокет в цикле, парся все данные, чтобы найти заголовок протокола, длину сообщения и данные.

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



Отредактировано py.user.next (Авг. 11, 2014 23:16:44)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version