【问题标题】:socket migration from boost::asio::io_service to another epoll loop套接字从 boost::asio::io_service 迁移到另一个 epoll 循环
【发布时间】:2015-05-15 11:46:19
【问题描述】:

我有一个 boost asio 插座。在我的自定义协议上握手阶段结束后。我想从 io_service 中取出套接字的本机句柄,并将其放入我自己的基于 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;
    }
  }
}

【问题讨论】:

  • 你的散文描述不是很清楚。您可以通过添加代码来增强它(模拟 epoll 库)。你让io_service 和套接字/管道对象保持活动状态吗?
  • 请注意,您可以使用 asio::null_buffers 来利用 asio proactor,但使用另一个库在本机套接字上执行实际 i/o。
  • 是的 io_service,socket 还活着。我不能只是复制粘贴,因为它很难创建一个微型版本。我观察到的是,在epoll_wait 循环中我触发了事件,但它的EPOLLOUT 只有一次。 EPOLLIN 在该 epoll 循环中被捕获。
  • 我也没有发现描述清楚。添加代码,甚至是模型,都会有所帮助。目前尚不清楚服务器和客户端在做什么,但错误可能表明服务器关闭了套接字。您能否显示服务器上 Boost.Asio I/O 对象的生命周期以及套接字是如何迁移的?

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 2013-12-05
    • 2014-07-27
    • 2011-06-16
    • 2017-09-17
    • 2012-11-26
    • 2011-12-18
    • 2020-05-27
    相关资源
    最近更新 更多