关于来自Boost Asio的async_read_some回调函数

时间:2017-04-21 08:44:57

标签: c++ sockets asynchronous tcp boost-asio

我正在尝试使用boost::asio::ip::tcp::socket的成员函数async_read_some

从HTTP服务器异步读取数据
template<
    typename MutableBufferSequence,
    typename ReadHandler>
void-or-deduced async_read_some(
    const MutableBufferSequence & buffers,
    ReadHandler handler);

我想知道一种方法,告诉服务器在应用程序的客户端发生错误,以便服务器停止尝试将其余数据发送到客户端。

例如,假设我需要10个递归async_read_some函数调用来从服务器接收整个答案。当第4 async_read_some调用其handler函数时,我无法解析此handler函数中的接收数据,因为抛出某种异常。现在我想通知服务器发生错误,我不想收到剩下的消息。但是当我进入这个handler函数时,我应该怎么做呢?

我可以使用ip::tcp::socket::shutdown参数调用ip::tcp::socket::shutdown_type::shutdown_receive,但我不能使用相同的连接进行日后通信。

我也无法调用ip::tcp::socket的{​​{1}}成员函数取消正在进行的异步操作,因为此时在该套接字上实际上没有处理异步操作 - 只有异步操作的回调函数正在处理。

如果我不想关闭此连接,我应该如何正确处理这种情况?

1 个答案:

答案 0 :(得分:0)

我认为你应该关闭连接。通常,您不能将此连接用于将来的通信。特别是如果你shutdown就行了。

如果您尝试继续使用此连接,它可以接收垃圾(因为阅读上一个答案的一部分),发送垃圾(因为非完整的先前写入)或只是保持连接断开(对等主机认为连接已关闭)

我认为async_read_some的任何错误(除了operation_aborted)对此连接都是致命的。