5

我用 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 数据报有可变长度。我不想使用带有大小的附加标头,因为它会使我的代码对第三方数据报无用。

4

1 回答 1

0

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

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

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

于 2013-08-21T01:18:58.400 回答