我使用boost :: asio udp套接字创建了我的UDP服务器和客户端。在我开始发送更多数据报之前,一切看起来都不错。它们从客户端正确到达服务器。但是,他们在我的缓冲区中联合成一条消息。
我用
带有udp::socket::async_receive
缓冲区的 std::array<char, 1 << 18 >
用于发出异步请求。并通过回调接收数据
void on_receive(const error_code& code, size_t bytes_transferred)
如果我发送数据过于频繁(每10毫秒),我会同时收到多个数据报进入上面的回调。问题是 - 如何分开他们?注意:我的UDP数据报有可变长度。我不想使用带有大小的附加标题,因为它会使我的代码对第三方数据报无用。
答案 0 :(得分:0)
我认为这是boost :: asio处理无状态数据流的方式的限制。当使用boost :: asio作为串行接口时,我注意到了完全相同的行为。当我发送它们之间有相对较大间隙的数据包时,我在一个单独的回调中收到了每个数据包。随着数据包大小的增加以及数据包之间的差距因此减小,它达到了仅在缓冲区已满时才执行回调的阶段,而不是在收到单个数据包之后。
如果您确切知道预期数据报的大小,那么限制输入缓冲区大小的解决方案是完全合理的,因为您事先知道缓冲区需要多大的数量。
如果您的拥塞来自于传输多个不同的数据包类型,那么您无法预先分配正确的大小缓冲区,那么您可能会为每种类型的事务在不同的端口上创建不同的套接字。它有点“hacky”但是考虑到短暂端口可用性的几乎无限的性质,只要你没有使用20,000种不同的数据包类型,这可能会帮助你。