我有一个提升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;
}
}
}
答案 0 :(得分:0)
这是asio的一个设计缺陷,它太受限制了。操作系统没有这样的强制执行,即套接字只能属于一个监视器,但库强制执行此操作。 proactor不允许OS套接字句柄从一个套接字分离,而不是附加到另一个套接字对象。这绝对是不可行的。