2017-09-04 37 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

謝謝,這很可能是相關的。 –

相關問題