Почему объекты socket.makefile перестают работать после первого чтения для сокетов UDP? - PullRequest
2 голосов
/ 18 апреля 2010

Я использую метод socket.makefile для создания файлового объекта на UDP-сокете для целей чтения. Когда я получаю пакет UDP, я могу прочитать все содержимое пакета одновременно, используя метод read, но если я пытаюсь разделить его на несколько операций чтения, моя программа зависает.

Вот программа, которая демонстрирует эту проблему:

import socket
from sys import argv

SERVER_ADDR = ("localhost", 12345)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(SERVER_ADDR)
f = sock.makefile("rb")

sock.sendto("HelloWorld", SERVER_ADDR)

if "--all" in argv:
    print f.read(10)
else:
    print f.read(5)
    print f.read(5)

Если я запускаю вышеупомянутую программу с параметром --all, то она отлично работает и печатает HelloWorld. Если я запускаю его без этой опции, он печатает Hello и затем зависает при втором чтении. У меня нет этой проблемы с socket.makefile объектами при использовании TCP-сокетов.

Почему это происходит и что я могу сделать, чтобы остановить это?

1 Ответ

2 голосов
/ 18 апреля 2010

Вы отправляете 1 пакет, но звоните, прочитайте дважды. 2. чтение ничего не прочитает, так как нет новых пакетов для чтения / получения. read at udp socket читает один пакет и отбрасывает остальные данные, если вы не прочитали все байты. UDP не ориентирован на поток, он ориентирован на сообщения / дейтаграммы.

UDP не соответствует концепции файла. «файл» - это просто поток байтов, а не набор пакетов, и у него есть конец. Это очень похоже на TCP, вы читаете из него байты - не имеет значения, сколько операций чтения вы используете для чтения данных, и вы можете обнаружить конец этого.

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