【发布时间】:2019-06-27 03:45:34
【问题描述】:
我一直在使用 boost asio 套接字(UDP 和 TCP)来处理我的客户端服务器程序之间的自定义协议。它一直运行良好,直到我发现在 TCP async_send/async_recieve 调用上数据可以以组合块的形式到达。
例如,如果我发出两个发送调用,每个调用都有自己的数据包,它们可以在一个接收调用中合并到达。我错误地假设每个发送都对应一个接收,但我显然错了。然而,在我发现为不同操作系统运行客户端的问题之前,它一直运行良好。
所以我的问题是:是否可以保证每次接收呼叫时数据的完整性? (例如 async_send 128 字节以 128 字节的倍数到达,或者它的到达方式必须始终被视为随机的,比如 1 字节到达然后 127 字节是可能的)
更具体地说,这是否意味着:
- 每次发送调用的数据可以连接或部分到达,我 必须始终手动处理连接/部分数据
- UDP 和 TCP asio 套接字都这样吗?
我四处搜索,找不到任何关于此的文档,所以我想知道是否有人有任何想法。
【问题讨论】:
-
"如果我用自己的数据包进行两次发送调用,它们可以在一个接收调用中合并到达。" ----------------怎么说呢?你跟踪过 TCP 数据包吗? “然而,在我发现为不同操作系统运行客户端的问题之前,它一直运行良好。” ---------- 所以,我相信你怀疑的不是ASIO,而是操作系统。 “数据完整性”-----你所说的数据完整性是什么意思?看起来服务器发送的数据已经完全接收了,但唯一的问题是它被合并了。
-
所以在最长的时间里,我所做的每个 async_send 调用都有一个相应的 async_recieve 调用。例如,我可以 async_send 使用 128 字节的数据包,然后在 async_recieve 处理程序端我得到整个 128 字节的数据。但事实证明这并非在所有情况下都是如此,所以在我进行两次 async_send 调用的情况下,每个调用都有 128 字节的数据包,单个 async_recieve 将获得 256 字节,这需要我拆分我不确定的数据为什么它如此长时间地工作。此行为不会在非 Windows 机器上发生,因此它必须依赖于操作系统。
-
将您的接收缓冲区大小更改为您希望从单个
async_receive操作接收的任何大小,因此无论您在哪个平台上,读取都将受到缓冲区大小的限制,除了那个,我在async_read/write文档中没有找到关于你的术语“数据完整性”的 ASIO 谈话(甚至没有接近)。
标签: c++ sockets networking tcp boost-asio