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