当流关闭时,boost :: asio :: async_read的ReadHandler应该返回什么error_code?

时间:2017-09-06 15:39:52

标签: c++ boost boost-asio

我正在尝试为任意流实现以下内容(包括读取和写入接口)。

http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/reference/AsyncReadStream.html

我打算做的是将流传递给某个客户端。客户端async_writes到流,当没有更多数据时,它关闭流。

来自流的调用代码async_reads,直到我假设它通过ReadHandler error_code获得流关闭状态的某些指示。我的问题是:

  1. error_code会是什么?

  2. 我可以保证使用这种机制传输所有数据吗?

  3. 有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

底线是:它取决于实施。如果你想抽象出那个界面,我建议在你自己的界面背后抽象实现细节。

如果您/希望/要公开Asio接口(为什么?),那么您可以创建一个组合IO操作,将所有可预期的错误转换为普通合同。

对于特定的实现,一个简单的测试就足够了。

对于套接字,通常的错误代码是eofboost::asio::error::misc_errors::eof)。视具体情况而定boost::asio::error::basic_errors::connection_resetboost::asio::error::basic_errors::network_reset

如果暂停io_service,服务对象将被销毁或套接字关闭,可能需要boost::asio::error::basic_errors::operation_abortedboost::asio::error::basic_errors::bad_descriptor

当然,所有这些都取决于实现。不同的平台可能有不同的代码,不同的流可能有不同的代码。

错误条件

您可以尝试确保错误条件映射到相同的"事物"而不是错误代码。所以客户端将拥有一致的界面。