Boost.Asio:async_read 和 async_receive 的区别

14

它们执行不同的任务。一个只是读取,另一个则读取特定数量或错误。请参阅您链接的页面 - 它们会告诉您。 - Thanatos
2个回答

11
async_receive 是一个接收数据到缓冲区的函数,但可能不会接收您要求的数量。它将等于或少于您要求的数量,永远不会更多。
然而,async_read 将始终接收您要求的数量,正如其所述:
这个函数用于从流中异步读取一定数量的字节数据。该函数调用总是立即返回。异步操作将继续,直到满足以下条件之一为止:
- 提供的缓冲区已满。也就是说,传输的字节数等于缓冲区大小的总和。 - 发生错误。
页面唯一有点模糊的地方是如果 async_read 没有获得那么多字节并且连接正常关闭,它会怎么做(是否视为“错误”)?这可以通过快速测试确定。(然而,async_receive 将只返回它所接收到的数据。)

作为对自己问题的回答:如果 async_read 没有获取到所需字节数,因为流在请求的大小被获取之前正常关闭,那么读取处理程序将以 boost::asio::error::eof 的错误调用。 - Thanatos

1

第一个是自由函数,第二个是成员函数。

另一个区别是socket_base::message_flags flags参数。例如,在{{link1:recv(2)}}手册页面中查看可能的值。

编辑:

使用async_receive时,您需要检查收到了多少字节。如果要读取最多N个字节,请使用它,而不是使用async_read读取恰好N个字节。抱歉,我以为这在boost文档中是显而易见的。


我应该在什么情况下使用其中之一? - Clark Gaebel
如果您需要确保在异步操作完成之前接收到所请求的数据量,请考虑使用async_read函数。 - Thanatos
那么这是否意味着,如果我使用async_recieve,我可能无法获取所有数据,但错误标志将显示一切正常?我不太确定那行代码的意思。 - Clark Gaebel
3
来自async_receive的链接:“接收操作可能无法接收到所有请求的字节数。” 是的。网络操作通常是这样的:您可能无法获得您所请求的所有内容(对方没有发送,还在传输中等等)。如果您确定要X个字节,则async_read是一个方便的函数,它会不断尝试获取内容。 - Thanatos
太好了,谢谢。您能把它写成答案吗,这样我就可以接受它了吗? - Clark Gaebel
是的,使用async_receive时,您需要检查收到了多少字节。如果想读取最多N个字节而不是恰好N个字节(async_read),请使用它。 - Nikolai Fetissov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接