如何拆分使用boost asio udp套接字联合数据报

val*_*y_l 5 sockets udp datagram boost-asio

我用boost :: asio udp套接字创建了我的UDP服务器和客户端.在我开始发送更多数据报之前,一切看起来都不错.它们从客户端正确到达服务器.但是,他们在我的缓冲区中联合成一条消息.

我用

udp::socket::async_receivestd::array<char, 1 << 18 >缓冲区

用于制作异步请求.并通过回调接收数据

void on_receive(const error_code& code, size_t bytes_transferred)

如果我经常发送数据(每10毫秒),我会在上面的回调中同时收到几个数据报到我的缓冲区.问题是 - 如何分开它们?注意:我的UDP数据报具有可变长度.我不想使用带有大小的附加标头,因为它会使我的代码对第三方数据报无用.

Ocu*_*mer 0

我相信这是 boost::asio 处理无状态数据流方式的限制。当使用 boost::asio 作为串行接口时,我注意到完全相同的行为。当我发送数据包之间的间隙相对较大时,我会在单独的回调中接收每个数据包。随着数据包大小的增加以及数据包之间的间隙的减小,它达到了只有在缓冲区已满时才会执行回调的阶段,而不是在收到单个数据包后。

如果您确切地知道预期数据报的大小,那么限制输入缓冲区大小的解决方案是一个完全明智的解决方案,因为您先验地知道缓冲区需要有多大。

如果您的拥塞来自于传输多种不同的数据包类型,因此您无法预先分配正确大小的缓冲区,那么您可能会在不同端口上为每种类型的事务创建不同的套接字。这有点“hacky”,但考虑到临时端口可用性几乎无限的性质,只要您不使用 20,000 种不同的数据包类型,这也可能会帮助您。