2017-09-04 77 views
0

我有具有接受一个AsyncWriteStream的功能的API这里定义:可以使用asio basic_stream_socket(或存在等价物)写入文件吗?

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

这是当前使用的(和作品)使用流数据到TCP套接字,:

http://www.boost.org/doc/libs/1_41_0/doc/html/boost_asio/reference/basic_stream_socket.html

我的问题是,这个接口是否也可以用于流式传输到磁盘上的文件。我怀疑答案是肯定的,但我想知道需要多少努力,特别是如果现有的实现支持接口。

所以,重申一下。该API函数如下:

template <class AsyncWriteStream> 
void stream_read(AsyncWriteStream &stream, completion_callback CB) { ... 

内部的API将数据写入AsyncWriteStream使用boost::asio::async_write来。我希望AsyncWriteStream能够流到tcp和文件套接字。也许我的问题也可以表述为“能创建一个流向磁盘而不是tcp的basic_stream_socket?”

我需要这个工作在Windows和Linux上。

回答

1

这也许是重复的。从这里给出的答案:Whats the deal with boost.asio and file i/o?

对于Windows使用:windows::random_access_handle并管理偏移量。 (请注意,windows::stream_handle不支持eof,请参阅:C++ boost asio Windows file handle async_read_until infinite loop - no eof)。

对于Linux,请打开文件,然后使用posix::stream_descriptor。 (请注意,asio不支持文件io的epoll,请定义BOOST_ASIO_DISABLE_EPOLL)

以上两种似乎都支持AsyncWriteStream接口,但我仍然需要测试。

+1

尽管这应该起作用,但请注意Linux上的文件访问主要是同步/阻塞。这意味着你这个流上的'read_async'和'write_async'将表现得像一个阻塞的读写(只有异步回调)。如果你不确定,你可能需要将实际工作推迟到某种文件工作者线程或线程池。这是例如node.js/libuv如何处理异步文件访问。 – Matthias247

+0

谢谢,这很可能是相关的。 –

相关问题