Чтение из сокета: гарантированно получено хотя бы x байтов?
У меня есть редкая ошибка, которая возникает при чтении сокета.
Кажется, что при чтении данных иногда я получаю только 1-3 байта пакета данных, который больше этого.
Как я узнал из конвейерного программирования, я всегда получаю как минимум 512 байт, если отправитель предоставляет достаточно данных.
Также мой отправитель по крайней мере передает>= 4 байта в любое время, когда он передает что-либо - поэтому я думал, что как минимум 4 байта будут получены сразу в начале (!!) передачи.
Похоже, что в 99,9% всех случаев мое предположение остается в силе ... но есть действительно редкие случаи, когда получено менее 4 байтов. Мне кажется смешным, почему сетевая система должна это делать?
Кто-нибудь знает больше?
Вот код чтения, который я использую:
mySock, addr = masterSock.accept()
mySock.settimeout(10.0)
result = mySock.recv(BUFSIZE)
# 4 bytes are needed here ...
...
# read remainder of datagram
...
Отправитель отправляет полную дейтаграмму одним вызовом отправки.
Изменить: все это работает на локальном хосте - так что никаких сложных сетевых приложений (маршрутизаторы и т. Д.) Не участвуют. Значение BUFSIZE составляет не менее 512, а отправитель отправляет не менее 4 байтов.