Найти - Пользователи
Полная версия: Буффер UDP сервера
Начало » Network » Буффер UDP сервера
1 2
Андрей Светлов
С русским у вас достаточно хорошо, не переживайте.

Буфер у сокета таки циклический, на столько пакетов сколько хватит по памяти. Старые затираются в случае 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)
Как и следовало ожидать, будут получены 10 разных пакетов (то, что у них сохранится порядок - не гарантировано на сложных маршрутах).
коля
Большое спасибо Андрей!
Ситуация выяснилась.
Размер буффера задается socket.SO_RCV_BUF= …
Буффер не циклический. При переполнении новые пакеты теряются, но старые сохраняются. Каждое recv(packet_size) читает только один пакет. Таймаут сохранения не обнаружил.

Если скажем в буффере остались 4 байта, а следующии пакет 6 байта - он целиком сохраняется, а следующие теряются.

У меня буффер был 32к - увеличил до 2М и 150 клиентов высылают GGA и RMC через 1 сек без потеря ни одного пакета.
Ето на одной и той же машине. В реальном мире потери будут, но ето и ожидается - у меня в пакет порядковый номер.

В recv(packet_size), packet_size ето максимальная длина одного пакета. При получении пакета большого размера ошибка получается.

Может кому-то понадобится …
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB