boost之asio相关

1. mutable_buffers_1

class mutable_buffers_1

  : public mutable_buffer

{

      //主要就是提供这2个函数

const_iterator begin();

const_iterator end():

}


mutable_buffer就是封装了void*, size


2.basic_streambuf

--------------------------------------------------

 +                        +

gptr()                 pptr()


gptr() <-->pptr()之间就是已写数据,pptr()是尚未使用的缓冲区

prepare(size_t n);获取n bytes缓冲区,不够就申请

commit(size_t n);pptr()向前移动n bytes

consume(size_ n);gptr()向前移动n bytes


3.

sactter-gaterh理念的实现:

template <typename Stream>
class buffered_write_stream
  : private noncopyable
{
  std::size_t read_some(const MutableBufferSequence& buffers)
  {
    return next_layer_.read_some(buffers);
  }

  template <typename ConstBufferSequence>

  std::size_t write_some(const ConstBufferSequence& buffers,
      boost::system::error_code& ec)
  {
    ec = boost::system::error_code();
    if (boost::asio::buffer_size(buffers) == 0)
      return 0;
    if (storage_.size() == storage_.capacity() && !flush(ec)) //缓冲区写满后才write
      return 0;
    return copy(buffers);
  }

  std::size_t flush(boost::system::error_code& ec)
  {
    std::size_t bytes_written = write(next_layer_,
        buffer(storage_.data(), storage_.size()),
        transfer_all(), ec);
    storage_.consume(bytes_written);
    return bytes_written;
  }

};


template <typename Stream>
class buffered_read_stream
  : private noncopyable
{
  template <typename ConstBufferSequence>
  std::size_t write_some(const ConstBufferSequence& buffers,
      boost::system::error_code& ec)
  {
    return next_layer_.write_some(buffers, ec);
  }
 
  template <typename MutableBufferSequence>
  std::size_t read_some(const MutableBufferSequence& buffers)
  {
    if (boost::asio::buffer_size(buffers) == 0)
      return 0;

    if (storage_.empty())
      fill();

    return copy(buffers); //有一个缓冲区,一次读取指定大小的数据,读完后分次复制给传进来的参数,只有内部缓冲区被读完后,再重新读取数据
  }

   std::size_t fill(boost::system::error_code& ec)
  {
    detail::buffer_resize_guard<detail::buffered_stream_storage>
      resize_guard(storage_);
    std::size_t previous_size = storage_.size();
    storage_.resize(storage_.capacity());
    storage_.resize(previous_size + next_layer_.read_some(buffer(
            storage_.data() + previous_size,
            storage_.size() - previous_size),
          ec));

    resize_guard.commit();
    return storage_.size() - previous_size;
  }
};


asio所有的事情都是在io_service::run里面开始处理的,完成后才返回


boost::asio::ip::tcp::acceptor在构造函数里面会调用bind,listen


io_service内部维护一个service链表,所有这些service的owner必须指向同一个io_service

io_service的所有操作都是交给service(_impl)完成。


win_iocp_io_service : public service_base{};

service_base : public service{};

class service

{

     提供一个get_io_service();

     一个io_service& owner;

    一个service* next指针

};


这种处理方式似乎越来越多

// Base class for all operations. A function pointer is used instead of virtual
// functions to avoid the associated overhead.
class win_iocp_operation
  : public OVERLAPPED
    BOOST_ASIO_ALSO_INHERIT_TRACKED_HANDLER
{};


win_iocp_io_service

{

post_deferred_completion:如果投递失败,将请求放入队列中

}


win_iocp_socket_service_base:

1.有WSAXXX操作的,就用iocp,没有的,如connect就用reactor

2.send / receive有四种:

①:同步操作,用socket_ops:sync_send

②:异步等待可以发送的时机,用socket_ops::poll_write()(内部就是一个write的select)

③:正常异步发送,用iocp

④:异步发送null缓冲区,用reactor

win_iocp_socket_service:public win_iocp_socket_service_base{}

按照上述四种模式增加了send_to / async_send_to, receive_from / async_receive_from 


connect/acceptor结构

socket_acceptor_service : public service_base
{
    win_iocp_socket_service service_impl_type
};
basic_stream_socket : public service_base
{
  win_iocp_socket_service service_impl_type
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值