【发布时间】: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