boost::asio 中async_read與async_receive的區別
現象:在調用async_read後,即便收到數據包,也沒有調用相應的ReadHandler 回調函數
void handle_connect(const boost::system::error_code & error,
tcp::resolver::iterator endpoint_iterator)
{
if(!error)
{
socket_.async_receive(boost::asio::buffer(buf_),
boost::bind(&tcp_client::handler_read_response,this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
//直到收到的字節數可以填滿buf_(即256個字節)或出錯,才調用handler_read_responsehandler_read_response;不然即便收到包也不進行處理。
boost::asio::async_read(socket_,boost::asio::buffer(buf_),
boost::bind(&tcp_client::handler_read_response,this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
//一旦收到數據或出錯,就調用handler_read_response
}
}
tcp::socket socket_;
boost::array buf_;
void handler_read_response(const boost::system::error_code & error, size_t /*bytes_transferred*/) //注意類型,error有引用,而bytes_transferred沒有引用
//聲明:boost/asio/read.hpp
template
void async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
ReadHandler handler);
//定義: boost/asio/impl/read.hpp
* @code void handler(
* const boost::system::error_code& error, // Result of operation.
*
* std::size_t bytes_transferred // Number of bytes copied into the
* // buffers. If an error occurred,
* // this will be the number of
* // bytes successfully transferred
* // prior to the error.
* );
template
typename ReadHandler>
inline void async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
ReadHandler handler)
{
async_read(s, buffers, transfer_all(), handler);
}
* @par Example
* To read into a single data buffer use the @ref buffer function as follows:
* @code boost::asio::async_read(s,
* boost::asio::buffer(data, size),
* boost::asio::transfer_at_least(32),
* handler); @endcode
* See the @ref buffer documentation for information on reading into multiple
* buffers in one go, and how to use it with arrays, boost::array or
* std::vector.
*/
template
typename CompletionCondition, typename ReadHandler>
void async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
CompletionCondition completion_condition, ReadHandler handler);
template
void async_receive(const MutableBufferSequence& buffers, ReadHandler handler)
{
this->service.async_receive(this->implementation, buffers, 0, handler);
}
結論:
async_receive包含有CompletionCondition, 在調用
void async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,ReadHandler handler)時,必須等到填滿Buffer,不然即便收到數據包,也不會沒有調用ReadHandler句柄;
async_read只要收到數據,就會被調用socket