![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прием большого потока данных по UDP
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]собирать на отдельном сервере.
поднять приоритеты получалке.
настучать в тыкву авторам передавалки.
%-)