Найти - Пользователи
Полная версия: Где read() видит EOF в socket.makefile()?
Начало » Python для новичков » Где read() видит EOF в socket.makefile()?
1
Virtul
Объясните, пожалуйста, код ниже получает TCP ответ от сервера на ура:
socket_f = socket.makefile()
data = socket_f.read()

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

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

Или так, EOF ставит в стрим сама ОС, когда все tcp сегменты сообщения получены?
py.user.next
Для анализа можешь использовать 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 - это просто абстракция, которая означает, что символов больше нет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB