我正在尝试为任意流实现以下内容(包括读取和写入接口)。
http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/reference/AsyncReadStream.html
我打算做的是将流传递给某个客户端。客户端async_writes到流,当没有更多数据时,它关闭流。
来自流的调用代码async_reads,直到我假设它通过ReadHandler error_code获得流关闭状态的某些指示。我的问题是:
这error_code
会是什么?
我可以保证使用这种机制传输所有数据吗?
有更好的方法吗?
答案 0 :(得分:1)
底线是:它取决于实施。如果你想抽象出那个界面,我建议在你自己的界面背后抽象实现细节。
如果您/希望/要公开Asio接口(为什么?),那么您可以创建一个组合IO操作,将所有可预期的错误转换为普通合同。
对于特定的实现,一个简单的测试就足够了。
对于套接字,通常的错误代码是eof
(boost::asio::error::misc_errors::eof
)。视具体情况而定boost::asio::error::basic_errors::connection_reset
或boost::asio::error::basic_errors::network_reset
。
如果暂停io_service
,服务对象将被销毁或套接字关闭,可能需要boost::asio::error::basic_errors::operation_aborted
或boost::asio::error::basic_errors::bad_descriptor
。
当然,所有这些都取决于实现。不同的平台可能有不同的代码,不同的流可能有不同的代码。
您可以尝试确保错误条件映射到相同的"事物"而不是错误代码。所以客户端将拥有一致的界面。