2017-09-04 4 views
0

J'ai une API qui a une fonction qui accepte un AsyncWriteStream tel que défini ici:Peut-on utiliser asio basic_stream_socket (ou un équivalent) pour écrire dans un fichier?

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

Ceci est actuellement utilisé (et travaux) flux de données à une prise tcp, en utilisant:

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

Ma question est que cette interface peut également être utilisée pour diffuser dans un fichier sur le disque. Je suppose que la réponse est oui, mais j'aimerais savoir combien d'efforts sont nécessaires et surtout s'il y a des implémentations existantes qui supportent l'interface.

Donc, pour réitérer. La fonction API ressemble à:

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

interne de l'API écrit des données en utilisant AsyncWriteStream boost::asio::async_write. Je veux qu'AsyncWriteStream soit capable de streamer à la fois sur tcp et sur socket. Peut-être que ma question pourrait aussi être formulée "peut-on créer un basic_stream_socket qui est diffusé sur le disque au lieu de tcp?" J'ai besoin de cela pour travailler sous Windows et Linux.

Répondre

1

Ceci est peut-être un doublon. À partir des réponses données ici: Whats the deal with boost.asio and file i/o?:

Pour l'utilisation de Windows: windows::random_access_handle et gérer le décalage. (Notez que windows::stream_handle ne prend pas en charge la fonction eof, voir: C++ boost asio Windows file handle async_read_until infinite loop - no eof).

Pour Linux, ouvrez le fichier, puis utilisez posix::stream_descriptor. (Notez que asio ne supporte pas epoll pour le fichier io, définissez BOOST_ASIO_DISABLE_EPOLL)

Les deux éléments ci-dessus semblent prendre en charge l'interface AsyncWriteStream, même si je n'ai pas encore testé.

+1

Même si cela devrait fonctionner, sachez que l'accès aux fichiers sous Linux est principalement synchrone/bloquant. Ce qui signifie que vos 'read_async' et' write_async' sur un tel flux se comporteraient comme un blocage de lecture et d'écriture (seulement avec un rappel asynchrone). Si vous n'êtes pas d'accord avec cela, vous devrez peut-être reporter le travail réel à une sorte de thread de travail ou de threadpool. Ceci est par exemple la façon dont node.js/libuv gère l'accès aux fichiers asynchrones. – Matthias247

+0

Merci, c'est susceptible d'être pertinent. –