Повышение ASIO - отброшенные UDP-пакеты, значительная потеря по сравнению с UE4 UDP-приемником - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь использовать простой асинхронный UDP-прослушиватель, используя this .Я также использую UE4 UDP Socket (FUdpSocketBuilder) в проекте игрового движка.Я не запускаю эти два прослушивателя UDP одновременно.Я получаю серию байтового массива из фиксированного порта udp из другого приложения в следующем порядке: начало 36, середина 65488 x 6 и конец 400 байтов.Но проблема в том, что я пропускаю 4 x 65488 байт, и иногда я получаю последние 400 байт в приложении C ++ на примере boost asio.Я попытался увеличить размер полученного байтового массива до большого числа, включая 7-8 раз, что указано ниже:

 constexpr int udp_buffer_size = 65536;  // Max limit of each packet size
 boost::array<char, udp_buffer_size> recv_buffer_;

Что я могу сделать, пожалуйста, совет?Я также задавал этот вопрос на Github .

Печать из Boost ASIO UDP:

I just recieved 36 bytes of data !
I just recieved 65488 bytes of data !
I just recieved 65488 bytes of data !
I just recieved 36 bytes of data !
I just recieved 65488 bytes of data !
I just recieved 65488 bytes of data !

Печать из UE4:

[2018.11.28 - 17.18.29:724][829]SomeProjectLog:  Warning : 2297. Recieved Bytes from UDP 36.
[2018.11.28 - 17.18.29:724][829]SomeProjectLog : Warning : 2298. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:724][829]SomeProjectLog : Warning : 2299. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:725][829]SomeProjectLog : Warning : 2300. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:725][829]SomeProjectLog : Warning : 2301. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:725][829]SomeProjectLog : Warning : 2302. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:725][829]SomeProjectLog : Warning : 2303. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:726][829]SomeProjectLog : Warning : 2304. Recieved Bytes from UDP 400.
[2018.11.28 - 17.18.29:726][829]SomeProjectLog : Warning : 2305. Recieved Bytes from UDP 36.
[2018.11.28 - 17.18.29:726][829]SomeProjectLog : Warning : 2306. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:726][829]SomeProjectLog : Warning : 2307. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:726][829]SomeProjectLog : Warning : 2308. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:727][829]SomeProjectLog : Warning : 2309. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:727][829]SomeProjectLog : Warning : 2310. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:727][829]SomeProjectLog : Warning : 2311. Recieved Bytes from UDP 65488.
[2018.11.28 - 17.18.29:727][829]SomeProjectLog : Warning : 2312. Recieved Bytes from UDP 400.

1 Ответ

0 голосов
/ 30 ноября 2018

Мне удалось исправить проблему потери пакетов UDP сегодня.Это не проблема параллелизма, которая может быть решена с помощью отдельного потока.Это вопрос скорости передачи данных внутри эпохи, а не между эпохами.Под этим я подразумеваю, что это поток данных, который сбрасывает UDP-пакеты в эпоху портов (значительное событие) в эпоху с некоторой задержкой получения между ними.Это окно возможностей для обработки чего-либо, не в эпоху, а сразу после эпохи, которая составляет 400 конечных байтов.Я использую однопотоковую программу, но у меня есть объект ввода-вывода Boost ASIO для асинхронных операций.Все, что я сейчас делаю, - это быстрая копия памяти каждого массива байтов, полученного до тех пор, пока я не достигну по модулю - N (общее количество байтов), затем я обрабатываю каждый пакет из накопленного массива, затем я могу собрать все данные без потери пакетов!Спасибо за помощь @ SergeyA
Если вы хотите узнать больше о том, почему не рекомендуется использовать потоки, кроме усложнения приложения, вот ссылка : Шаблон проектирования Proactor: параллелизм без потоков.

...