4

我使用 boost asio 开发客户端/服务器应用程序,专门boost::asio::ip::tcp::socket用于连接和传输数据。现在我boost::asio::async_read用来接收一定数量的字节。直到现在,在调用我的处理程序之前,在所有情况下我都知道我想要接收多少字节。因此,我看不出使用 sockets meber 函数的理由read_some。但我想知道为什么没有“async_read”成员函数,boost::asio::ip::tcp::socket而只有免费的。

所以我的问题是:是否有概念或技术原因导致有read_some成员函数但没有read成员函数,或者“Boost 只是忘记实现它”?

4

2 回答 2

5

Asio 中的所有流接口都提供了方法read_someasync_read_some方法。这适用于 TCP 套接字、SSL 流和串行端口。基于使用该方法read, , 及其异步表亲的实现都具有相同的实现。该函数被编写为一个通用模板,它可以在其第一个参数上使用该方法来按照您的要求执行调用。read_untilread_somereadread_some

有一些 C++ 倡导者建议尽可能使用非友元非成员函数,以便在类实现发生更改时将更改降至最低。 read_some是接口,read只是一个包装器,在对各种不同来源进行部分读取的情况下添加阻塞。

于 2013-01-17T16:52:54.777 回答
3

正如 Dave S 所说,您会在 boost\boost\asio\read.hpp 中找到这些外部辅助函数

如果您查看boost 1.52 asio 示例blocking_tcp_echo_clientblocking_tcp_echo_server示例使用write(). 该示例使用该示例read_some()是因为它不预先知道大小...但是 write 函数与您的 read 问题完全相似,并且也作为助手存在write.hppread.hpp.

基本上:

 tcp::socket s(io_service);
 char buff[LENGTH];
 boost::asio::write(s, boost::asio::buffer(buff, LENGTH));
 boost::asio::read(s, boost::asio::buffer(buff, LENGTH));
于 2013-01-17T17:16:56.983 回答