Boost ASIO-丢弃的UDP数据包,与UE4 udp接收器相比,损失很大

时间:2018-11-28 19:01:05

标签: c++ boost udp packet-loss

我正在尝试通过this使用简单的异步UDP侦听器。我还在游戏引擎项目中使用UE4 UDP套接字(FUdpSocketBuilder)。我不会同时运行这两个UDP侦听器。我从另一个应用程序的固定udp端口获取一系列字节数组,其顺序为开始36,中间65488 x 6和结束400字节。但是问题是我错过了4 x 65488字节,有时我在boost asio示例C ++应用程序中得到了尾随的400字节。我尝试将接收到的字节数组大小增加到一个高数字,包括下面声明的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 :(得分:0)

我今天能够解决UDP数据包丢失的问题。这不是可以通过使用单独的线程来解决的并发问题。这是数据速度跨时代而不是跨时代的问题。我的意思是,这是一个数据流,该数据流将UDP数据包在端口epoch(重要事件)上转储到epoch,之间存在一些获取延迟。那是处理任何东西的机会之窗,不是在时期内,而是在时期之后(即400个尾随字节)。我使用的是单线程程序,但我具有用于异步操作的Boost ASIO I / O对象。我现在要做的就是接收到的每个字节数组的快速内存副本,直到我达到模数-N(总共为纪元字节),然后处理累积数组中的每个数据包,然后我就可以收集所有数据而不会丢失任何数据包!谢谢@SergeyA的所有帮助
              如果您想了解更多有关为什么除了使应用程序变得复杂之外不建议使用线程的原因,这里是link:Proactor设计模式:无线程并发。