【问题标题】:Signal server about user-client error from Boost Asio's async_read_some callback function来自 Boost Asio 的 async_read_some 回调函数的关于用户客户端错误的信号服务器
【发布时间】:2017-09-18 04:15:26
【问题描述】:

我正在尝试使用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_type::shutdown_receive 参数调用ip::tcp::socket::shutdown,但我不能使用相同的连接进行未来的通信。

我也不能调用 ip::tcp::socketcancel 成员函数来取消正在进行的异步操作,因为此时实际上并没有在该套接字上处理任何异步操作 - 只有异步操作的回调函数正在处理。

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

【问题讨论】:

  • 也许我应该在发生错误时关闭套接字,然后在幕后创建一个新的

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


【解决方案1】:

我认为你应该关闭连接。通常,您不能将此连接用于未来的通信。特别是如果你在上面做shutdown

如果您尝试保持此连接,它可能会接收垃圾(因为读取了先前答案的一部分)、发送垃圾(因为未完成先前的写入)或只是保持断开的连接(对等主机认为连接已关闭) .

我认为async_read_some 的任何错误(除了 operation_aborted)如果对这个连接来说是致命的。

【讨论】:

  • 感谢您的回答!已经开始实现这一点,但很高兴知道其他人也认为这是要走的路:)
猜你喜欢
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多