套接字从boost :: asio :: io_service迁移到另一个epoll循环

时间:2015-05-15 11:46:19

标签: c++ sockets boost boost-asio epoll

我有一个提升asio socket。握手阶段结束后我的自定义协议。我想从io_service中取出socket的本机句柄,并把它放在我自己的基于epoll的循环中,在不同的线程上运行。

因此,在阅读完握手阶段的最后一条消息后,我调用boost::asio::async_read。但是将原生句柄添加到我自己的epoll循环中。

但在客户端,我得到Broken Pipe错误。

我试图在尝试写入之前延迟客户端,但即使我延迟了几秒钟它也会破坏管道。但是在那个延迟的时间里,服务器端应该有另一个读者,这就是epoll循环。

void hc::common::connection::handle_read(hc::common::connection::state s, const boost::system::error_code& error, std::size_t bytes){
  hook_read(error, bytes);
  if(!error){
    switch(s){
      case header:
        _packet.parse_header();
        ............
        break;
      case body:
        bool keep_reading = available(); // virtual << here it returns false by the overridden method
        _packet.clear();
        if(keep_reading){
            boost::asio::async_read(_socket, 
                boost::asio::buffer(_packet.data(), hc::common::packet::header_length),
                boost::asio::transfer_at_least(hc::common::packet::header_length),
                boost::bind(&hc::common::connection::handle_read, shared_from_this(), header, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
        }
        break;
    }
  }
}

1 个答案:

答案 0 :(得分:0)

这是asio的一个设计缺陷,它太受限制了。操作系统没有这样的强制执行,即套接字只能属于一个监视器,但库强制执行此操作。 proactor不允许OS套接字句柄从一个套接字分离,而不是附加到另一个套接字对象。这绝对是不可行的。