天天看点

boost::asio的http client应用笔记1 踩过的坑2. http client的应用

<code>boost::asio::io_service::run()</code>会一直运行到没有任务为止,如果中途调用<code>stop()</code>,则所有等待中的任务会立刻执行。要在停止的时候抛弃所有的任务,解决方案是用<code>run_one()</code>,即

keep_running是个bool值,要stop io_service的时候直接置false即可。

在调用<code>async_wait()</code>后,无论调用<code>deadline_timer::cancel()</code>还是这个deadline_timer都析构掉,<code>handler</code>都会被触发。当然,这个在文档是有写的。规避野指针的办法有两个,一是传入的<code>handler</code>是shared_ptr,二是再封装一层。后者适用于<code>handler</code>的生命周期无法由自身控制的情况,示例代码请看http client一节的TimerHolder类。

这个其实和<code>deadline_timer::asyn::wait()</code>差不多,<code>async_read</code>、<code>async_read_until</code>等带async_前缀的函数,只要中途被停止(例如调用<code>ip::tcp::socket::close()</code>),<code>Handler</code>都会被执行并传入一个代表aborted的boost::system::error_code。

从ip::tcp::resolver得到的可能是多个IP,如果把返回的迭代器交给<code>async_connect</code>,那么很可能出错,应为IP里可能有不合理的地址。比如可能返回的是全0的地址。解决办法参考http client代码的<code>DoResolveAndConnect()</code>函数。

socket的read可能会读到额外的数据,这个文档里有写。

封装成了C++类。这是单线程的实现(io_service是同一线程下run的),同步地调用socket函数并用deadline_timer来异步返回数据会更容易控制。

不细说了,请看代码。

注:URL、HttpRequest、HttpResponse等类未列出源码,请自行实现对应函数。

#####################################################################