asio.async_read_some
Socket::async_read_some和socket::async_receive是一样的,唯一的细小区别是,socket::async_receive提供两种接口,其中一种增加了flags参数。因为绝大多数flags=0,所以这两个函数可以看成没区别。
Socket::async_write_some和socket::async_send也是一样的,唯一的细小区别依然是socket::async_send提供良种接口,其中一种增加了flags参数。
Asio::async_read有多种接口形式,最基本的一种是
template<
typename AsyncReadStream,
typename MutableBufferSequence,
typename ReadHandler>
void async_read(
AsyncReadStream & s,
const MutableBufferSequence & buffers,
ReadHandler handler);
这种模式下,必须等到buffers全都被填满了,或者错误发生,才会进入完成函数。
如果希望收到特定数量的字节以上即进入完成函数,则应该调用
template<
typename AsyncReadStream,
typename MutableBufferSequence,
typename CompletionCondition,
typename ReadHandler>
void async_read(
AsyncReadStream & s,
const MutableBufferSequence & buffers,
CompletionCondition completion_condition,
ReadHandler handler);
这个CompletionCondition的实现方法可以参考completion_condition.hpp中的transfer_at_least,当然也可以实现其他更复杂的condition class。这个CompletionCondition class非常简单,只需要实现operator(error,bytestransfer)即可。
猜想如果transfer_at_least(1),则类似于socket::async_read_some
另外两个接口形式为:
template<
typename AsyncReadStream,
typename Allocator,
typename ReadHandler>
void async_read(
AsyncReadStream & s,
basic_streambuf< Allocator > & b,
ReadHandler handler);
template<
typename AsyncReadStream,
typename Allocator,
typename CompletionCondition,
typename ReadHandler>
void async_read(
AsyncReadStream & s,
basic_streambuf< Allocator > & b,
CompletionCondition completion_condition,
ReadHandler handler);
这两个函数和上面2个函数的区别应该是basic_streambuf<Allocator>的区别,可能可以自定义分配方式。
write系列函数类此。
一般来说,接收和发送时均应该使用asio::async_read/write,如果接收时协议无清晰格式,例如没有一个固定长度的header_len,则使用socket::async_read_some。
浙公网安备 33010602011771号