boost :: asio :: ip :: tcp :: socket中的async_read_some()实际上是如何工作的?

时间:2011-10-16 16:46:00

标签: c++ boost boost-asio

它写在documentation

  

此函数用于异步读取流中的数据   插座。函数调用总是立即返回。

我知道它是异步的,所以它会立即返回。但是async_read_some()与自由函数read()的区别是什么?当我尝试std::cout我的缓冲区用于async_read_some()时,似乎该函数读取了很多次,直到流不在数据中。

这是否意味着async_read_some()会一直请求,直到它收到每个数据,例如,在HTTP GET请求中?服务器会一次写少许并向客户端发送一点(async_read_some()读取一点整数据),或者一次性将所有数据转储到客户端?

2 个答案:

答案 0 :(得分:7)

不,async_read_some()不会连续请求。

ip::tcp::socket::async_read_some()函数将进行系统调用以启动读取。

之后,当您下次传递到io_service::run()的{​​{1}} io_service时,ip::tcp::socket会检查io_service是否{ {1}}已读取任何数据。

如果已读取数据,则会调用您传递给async_read_some()的{​​{1}}回调。

如果尚未读取数据,则会在您下次致电ReadHandler时返回并再次检查完成情况。

答案 1 :(得分:4)

  

async_read_some()与自由功能read()的区别是什么?

顾名思义,成员方法async_read_some()是异步的。免费功能read()不是。

  

我尝试std::cout async_read_some()用于async_read_some()的缓冲区   该函数读取很多次,直到流没有数据。

它将从流中读取到您指定的缓冲区大小,这可能会也可能不会通过多次读取操作完成。

  

这是否意味着async_read_some()要求不断提出要求   接收每个数据,例如,在HTTP GET请求中?而且   服务器将一次写少量并向客户端发送一点   (对于{{1}}读取一点点整个数据),或者它   立即将所有数据转储到客户端?

不完全是。这意味着您的应用程序可以同时为多个套接字提供服务,而无需显式使用线程服务器和应用程序之间的交互与此处使用异步方法是正交的。您的应用程序应该期望一个字节流。服务器的实现方式与您的应用程序无关。