Python3 сокет - какова цель разделения сетевых пакетов - PullRequest
0 голосов
/ 27 марта 2020

Я новичок в модуле socket на Python 3. Во время исследования этого модуля я видел много примеров кода, где функция socket.recv(n) была вызвана несколько раз для "порции" данных. И почти во всех этих примерах кода используются такие шаблоны:

with socket.socket() as sock:
    sock.connect((host, port))
    to_read = int(sock.recv(8))
    sock.sendall(b'GOT SIZE')

    chunks = []
    while to_read:
        chunk = sock.recv(chunk_length)
        chunks.append(chunk)
        to_read -= chunk_length
    data = b''.join(chunks)

Поэтому у меня есть вопрос: какова цель разделения данных, если вы можете просто использовать sock.recv(to_read)?

1 Ответ

1 голос
/ 27 марта 2020

Какова цель разбивки данных на части , если вы можете просто использовать sock.recv (to_read)

recv не возвращает to_read байт. Возвращает до to_read байт. Особенно при больших значениях to_read очень вероятно, что вам нужно несколько recv, чтобы получить все запрошенные байты. Таким образом, «порция» необходима для того, чтобы фактически получить все данные.

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

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