[英]Boost.Asio: Operation Cancelled on async_read
我自己与Boost.Asio继续传奇的另一个...
我有一个简单的异步客户端和服务器,它使用async_write和async_read进行通信。 客户端可以成功地将字节写入套接字,但服务器永远不会看到它们; 我在服务器上的读取处理程序失败并显示“取消操作”。
我倾向于认为这可能是客户端在服务器尝试读取并失败后写入数据的时间问题,但我原本认为数据将在套接字上等待(除非套接字已经在此期间关闭)。
为了测试这个,我只是在错误处理程序中重新运行读取操作,即
read_handler()
{
if (!error) {
/* bytes read */
} else {
async_read(socket, buffer, read_handler)
}
}
但是这一切都让我通过调用async_receive
在pthread_mutex_lock
出现了段async_receive
。
任何人都可以指出我的任何相关信息的方向(或者,更好的是,告诉我到底我做错了什么;))?
更新 :服务器和客户端基于Asio文档中的聊天服务器示例,客户端和服务器都在相同的进程下运行(这可能是一个问题吗?想多一点,他们都使用相同的io_service ...) ; 异步和使用Boost 1.44.0。 我正在研究OS X,但这在Linux上也是可重现的。
更新II :我的预感是正确的,如果给服务器和客户端单独的io_service对象,async_read会看到套接字上的字节。 这仍然会在boost::asio::detail::kqueue_reactor::post_immediate_completion
中给出一个boost::asio::detail::kqueue_reactor::post_immediate_completion
,它似乎源于io_service.run()
。 在我进一步讨论之前,使用单独的io_service
对象是正确的方法吗?
当套接字关闭或取消时,将发送取消操作(operation_aborted错误代码)。
很可能你的连接超出了范围。
也许因为它发生在我身上,你忘了将async_handlers附加到shared_from_this ()指针。 即你应该像这样附上你的处理程序:
async_read(m_socket,
boost::asio::buffer((void*)m_buffer, m_header_size),
boost::bind(&TcpConnection::handleRead,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
而不是这样的:
async_read(m_socket,
boost::asio::buffer((void*)m_buffer, m_header_size),
boost::bind(&TcpConnection::handleRead,
this, //<- This will go out of scope and the socket will be closed
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.