Трябва да прочета най-новите входящи UDPпакет, независимо от изпуснатите пакети между четенията. Входящите пакети идват 3 пъти по-бързо от максималната скорост на обработка на приложенията. В опит да постигна това използвах setReceiveBufferSize(int size)
на Java DatagramSocket
клас за задаване на SO_RCVBUF
да е със същия размер като очаквания пакет в байтове.
Въпреки това, все още има забавяне от три пакета, преди да получа най-новия пакет (и ако входящата скорост е 10 пъти скоростта на приемане, има 10 забавяне на пакета). Това предполага, че SO_RCVBUF
съдържа повече от най-новия пакет.
Първо, са единиците на setReceiveBufferSize(int size)
в байтове? Това не е изрично посочено в javadocs, Второ, има ли начин да забраните SO_RCVBUF
така че получавам само последния входящ пакет? Например, нула е неправомерен аргумент за функцията, но теоретично бих могъл да настроя размера на приемния буфер на един.
Отговори:
1 за отговор № 1това изглежда като необичаен проблем;)
препоръчвам да разделите приложението си на отделни теми:
- приемник (минимална работа, без парсване / и т.н.)
- обработва входящите пакети и поставя последния прочетен обект в асинхронна променлива
- обработване (от това, което сте написали, изглежда, че това отнема много време)
- чете обекта от асинхронното пространство и го обработва (не забравяйте да игнорирате предишното)
ако трябва да хакнете неща като SO_RCVBUF, мисля, че трябва да стъпите малко по-близо до подсистемата за обработка на io с C / C ++
0 за отговор № 2
Направихте точно погрешно нещо. Задайте възможно най-голям приемащ буфер. 512k например. Задаването му на ниско ниво само увеличава вероятността за изпускане на пакети. И или да ускорите приемащия код, или да забавите изпращането на кода. Няма смисъл да изпращате пакети, които не могат да бъдат получени.