首页 文章

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

提问于
浏览
5

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

我用

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

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

void on_receive(const error_code& code, size_t bytes_transferred)

如果我发送数据 too often (每10毫秒)我收到 several datagrams simultaneously 进入我的缓冲区,回调如上 . 问题是 - 如何 separate 他们?注意:我的UDP数据报有 variable length . 我不会让我的代码对第三方数据报毫无用处 .

1 回答

  • 0

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

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

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

相关问题