在boost :: asio中,为什么没有用于读/写的套接字成员函数?

时间:2013-01-17 16:18:15

标签: c++ sockets boost boost-asio

我使用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只是忘了实现它”?

2 个答案:

答案 0 :(得分:4)

Asio中的所有流媒体接口都提供read_someasync_read_some个方法。这适用于TCP套接字,SSL流和串行端口。基于使用read方法,read_untilread_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_clientblocking_tcp_echo_server示例会使用write()的阻止形式。该示例使用read_some(),因为它不预先知道大小...但是write函数完全类似于您的读取问题,并且作为帮助write.hpp存在于{{1}的同一位置}}。

基本上:

read.hpp