Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прием большого потока данных по UDP


Страницы:   1 2

MBo ©   (2008-01-31 07:26:00) 

Задача следующая - некий спецдевайс передает по сети по протоколу UDP данные (видеопоток), порядка 11 мегабайт в секунду, пакет 770 байт - строка. Прием занимает очень значительную часть процессорного времени (применяется WSA-функции + RecvFrom, также пробовал использовать Indy и ICS), причем, если программа занимается еще чем-то, то пакеты, приходящие  в этот момент, теряются. Например, если после приема кадра отрисовывать его, то несколько первых строк следующего кадра не принимаются.

Можно ли предпринять какие-то меры к улучшению ситуации?
C сетями ранее не работал, так что могут помочь любые идеи.


Сергей М.   (2008-01-31 09:53:00) [21]


> MBo ©


Выноси транспортную логику в отдельный поток, повысь ему приоритет до разумных пределов.


Anatoly Podgoretsky   (2008-01-31 09:52:00) [22]

> MBo  (31.01.2008 09:43:06)  [6]

судя по снифферу, в стомегабитной локалке до машины пакеты доходят все, да и если программа не занимается обсчетом/отрисовкой, то она их все принимает.

Этого не должно быть, что то неправильно, в программе конечно.
Но я бы все таки задумался 11 мегабайт это на пределе возможностей 100 мб сети. Не каждая машина и сетевая карта в состоянии обеспечить.
А для процессора это ничто, доли процента.

Но сам протокол UDP не обеспечивает гарантированой доставки. Размер пакета надо снижать до минимума и делать буферизации, часть буферизации делает система.


Сергей М.   (2008-01-31 09:51:00) [23]


> MBo ©   (31.01.08 09:43) [6]


см. SetSockOpt(..SO_RCVBUF..)

Но это не спасет, если выборка из буфера стабильно медленней, чем запись в буфер.


ketmar   (2008-01-31 09:48:00) [24]

>[6] MBo ©(31.01.08 09:43)
а максимальный размер пакета, афаир, всё равно 64к. и очереди в UDP нет. не успал поймать — кранты тому, что лежало.


MBo   (2008-01-31 09:43:00) [25]

>11 мегабайт в секунду можно передать только в тепличных условиях
судя по снифферу, в стомегабитной локалке до машины пакеты доходят все, да и если программа не занимается обсчетом/отрисовкой, то она их все принимает.

>оно ж лежит в буфере
насчет размера буфера я пока не разобрался. В ICS и в Indy можно выставить размер буфера, который, как я понимаю, отвечает за максимальный размер пакета. А есть ли еще какие-то возможности указать сетевой подсистеме винды, чтобы побольше непрочитанных еще пакетов накапливалось?


ketmar   (2008-01-31 09:26:00) [26]

>[3] MBo ©(31.01.08 09:11)
для UDP — да. оно ж лежит в буфере только пока новое не притащат. да и не факт, что старое дойдёт. потеряется по дороге — и всё.


Anatoly Podgoretsky   (2008-01-31 09:13:00) [27]

> MBo  (31.01.2008 07:26:00)  [0]

Для такого потока нужен уже 1 гигабит, 11 мегабайт в секунду можно передать только в тепличных условиях.


MBo   (2008-01-31 09:11:00) [28]

т.е., такое потребление ресурсов и потери пакетов -  это нормальная ситуация?


Сергей М.   (2008-01-31 08:55:00) [29]


> если программа занимается еще чем-то


Сделай так чтобы она занималась только этим и ничем более


ketmar   (2008-01-31 08:53:00) [30]

собирать на отдельном сервере.
поднять приоритеты получалке.
настучать в тыкву авторам передавалки.

%-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо