Я использую метод 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-сокетов.
Почему это происходит и что я могу сделать, чтобы остановить это?