我使用boost asio处理客户端/服务器应用程序,特别是boost::asio::ip::tcp::socket
来连接和传输数据。现在我使用boost::asio::async_read
来回收一定数量的字节。到目前为止,在所有情况下,我都知道在调用处理程序之前我想要接收多少字节。因此,我没有理由使用套接字meber函数read_some
。但我想知道为什么boost::asio::ip::tcp::socket
没有“async_read”成员函数,只有免费的成员函数。
所以我的问题是:是否存在概念或技术原因,为什么有read_some
成员函数但没有read
成员函数,或者“Boost只是忘了实现它”?
答案 0 :(得分:4)
Asio中的所有流媒体接口都提供read_some
和async_read_some
个方法。这适用于TCP套接字,SSL流和串行端口。基于使用read
方法,read_until
,read_some
及其异步表兄弟的实现都具有相同的实现。 read
函数被编写为通用模板,可以在其第一个参数上使用read_some
方法来执行您请求的调用。
有些C ++倡导者建议尽可能使用非朋友非成员函数,以便在类实现发生更改时最小化更改。 read_some
是接口,read
只是一个包装器,可以在各种不同来源的部分读取时添加阻塞。
答案 1 :(得分:3)
正如Dave S所说,你会发现这些是boost \ boost \ asio \ read.hpp中的外部辅助函数
如果您查看the boost 1.52 asio examples,则blocking_tcp_echo_client和blocking_tcp_echo_server示例会使用write()
的阻止形式。该示例使用read_some()
,因为它不预先知道大小...但是write函数完全类似于您的读取问题,并且作为帮助write.hpp
存在于{{1}的同一位置}}。
基本上:
read.hpp