天天看點

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等類未列出源碼,請自行實作對應函數。

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