/ / Прочетете последния UDP пакет, като изключите SO_RCVBUF в Java DatagramSocket? - java, гнезда, мрежи, udp

Прочетете най-скорошния UDP пакет, като изключите SO_RCVBUF в Java DatagramSocket? java, sockets, networking, udp

Трябва да прочета най-новите входящи 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 например. Задаването му на ниско ниво само увеличава вероятността за изпускане на пакети. И или да ускорите приемащия код, или да забавите изпращането на кода. Няма смисъл да изпращате пакети, които не могат да бъдат получени.