• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

舞者

罗帏舒卷,似有人开。明月直人,无心可猜
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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。

posted on 2012-02-09 17:22  wishing  阅读(2237)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3