val*_*y_l 5 sockets udp datagram boost-asio
我用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数据报具有可变长度.我不想使用带有大小的附加标头,因为它会使我的代码对第三方数据报无用.
我相信这是 boost::asio 处理无状态数据流方式的限制。当使用 boost::asio 作为串行接口时,我注意到完全相同的行为。当我发送数据包之间的间隙相对较大时,我会在单独的回调中接收每个数据包。随着数据包大小的增加以及数据包之间的间隙的减小,它达到了只有在缓冲区已满时才会执行回调的阶段,而不是在收到单个数据包后。
如果您确切地知道预期数据报的大小,那么限制输入缓冲区大小的解决方案是一个完全明智的解决方案,因为您先验地知道缓冲区需要有多大。
如果您的拥塞来自于传输多种不同的数据包类型,因此您无法预先分配正确大小的缓冲区,那么您可能会在不同端口上为每种类型的事务创建不同的套接字。这有点“hacky”,但考虑到临时端口可用性几乎无限的性质,只要您不使用 20,000 种不同的数据包类型,这也可能会帮助您。
归档时间: |
|
查看次数: |
1062 次 |
最近记录: |