sockets - 如何拆分接收到的 boost asio udp 套接字联合数据报

标签 sockets udp boost-asio datagram

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

最佳答案

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

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

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

关于sockets - 如何拆分接收到的 boost asio udp 套接字联合数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11584184/

相关文章:

c# - 超过100位玩家在线时套接字失败

c++ - 在 obj-c/C++ 中使用 UDP 的例子?

java - 到达的 UDP 数据包与发送的数据包不同

c - UDP:每 x 秒从客户端读取一个新帧

java - 程序卡在 ObjectInputStream 构造函数处

sockets - 每台服务器的套接字连接的实际/硬性限制是多少

c++ - 没有 RTTI 的 ASIO

c++ - 使用 istream 从 boost::asio UDP 套接字中检索 float

c++ - 帮助 async_read_until

c# - 异步套接字客户端 ReceiveCallback 未执行