Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 10, 2010 01:06:00

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Буффер UDP сервера

С русским у вас достаточно хорошо, не переживайте.

Буфер у сокета таки циклический, на столько пакетов сколько хватит по памяти. Старые затираются в случае 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 разных пакетов (то, что у них сохранится порядок - не гарантировано на сложных маршрутах).



Офлайн

#2 Окт. 11, 2010 16:04:45

коля
От:
Зарегистрирован: 2010-09-09
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Буффер UDP сервера

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

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

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

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

Может кому-то понадобится …



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version