Форум сайта python.su
С русским у вас достаточно хорошо, не переживайте.
Буфер у сокета таки циклический, на столько пакетов сколько хватит по памяти. Старые затираются в случае UDP (с TCP чуть иначе, там перестают приходить подтверждения приема и передающая сторона приостанавливает передачу потока).
В подтверждение посмотрите на приложенный код, демонстрирующий мои слова
import socket
s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
ADDR = ('', 1234)
s1.bind(ADDR)
for i in range(10):
s2.sendto(("%4d\n" % i).encode('ascii'), ADDR)
for i in range(10):
data, addr = s1.recvfrom(5)
print (data.decode('ascii'), addr)
Офлайн
Большое спасибо Андрей!
Ситуация выяснилась.
Размер буффера задается socket.SO_RCV_BUF= …
Буффер не циклический. При переполнении новые пакеты теряются, но старые сохраняются. Каждое recv(packet_size) читает только один пакет. Таймаут сохранения не обнаружил.
Если скажем в буффере остались 4 байта, а следующии пакет 6 байта - он целиком сохраняется, а следующие теряются.
У меня буффер был 32к - увеличил до 2М и 150 клиентов высылают GGA и RMC через 1 сек без потеря ни одного пакета.
Ето на одной и той же машине. В реальном мире потери будут, но ето и ожидается - у меня в пакет порядковый номер.
В recv(packet_size), packet_size ето максимальная длина одного пакета. При получении пакета большого размера ошибка получается.
Может кому-то понадобится …
Офлайн