Boost ASIO - 丢弃的 UDP 数据包,与 UE4 udp 接收器相比有重大损失
Boost ASIO - dropped UDP packets, significant loss compared to UE4 udp reciever
我正在尝试通过 this 使用简单的异步 UDP 侦听器。我还在游戏引擎项目中使用 UE4 UDP Socket (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.
我今天能够解决 UDP 数据包丢失问题。这不是使用单独的线程可以解决的并发问题。这是时代内数据速度的问题,而不是时代间的问题。我的意思是,它是一个数据流,将端口时期(重大事件)上的 UDP 数据包转储到时期,其间有一些采集延迟。这是 window 处理任何东西的机会,不是在纪元内,而是在纪元之后,即 400 个尾随字节。我正在使用单线程程序,但我有用于异步操作的 Boost ASIO i/o 对象。我现在所做的就是对接收到的每个字节数组进行快速内存复制,直到我达到模数 - N(epoch 字节总数),然后我处理来自累积数组的每个数据包,然后我能够收集所有数据而不会丢失任何数据包!感谢所有帮助@SergeyA
如果您想了解更多关于为什么除了使应用程序变得复杂之外不建议使用线程的原因,这里是 link:Proactor 设计模式:没有线程的并发。
我正在尝试通过 this 使用简单的异步 UDP 侦听器。我还在游戏引擎项目中使用 UE4 UDP Socket (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.
我今天能够解决 UDP 数据包丢失问题。这不是使用单独的线程可以解决的并发问题。这是时代内数据速度的问题,而不是时代间的问题。我的意思是,它是一个数据流,将端口时期(重大事件)上的 UDP 数据包转储到时期,其间有一些采集延迟。这是 window 处理任何东西的机会,不是在纪元内,而是在纪元之后,即 400 个尾随字节。我正在使用单线程程序,但我有用于异步操作的 Boost ASIO i/o 对象。我现在所做的就是对接收到的每个字节数组进行快速内存复制,直到我达到模数 - N(epoch 字节总数),然后我处理来自累积数组的每个数据包,然后我能够收集所有数据而不会丢失任何数据包!感谢所有帮助@SergeyA
如果您想了解更多关于为什么除了使应用程序变得复杂之外不建议使用线程的原因,这里是 link:Proactor 设计模式:没有线程的并发。