4

boost::asio::ip::tcp::socket特にデータを接続して転送するために、boost asioを使用してクライアント/サーバーアプリケーションに取り組んでいます。現在boost::asio::async_read、一定量のバイトを受信するために使用しています。これまでは、どのような場合でも、ハンドラーを呼び出す前に、受信したいバイト数を知っていました。したがって、 sockets meber function を使用する理由がわかりませんread_some。しかし、なぜ「async_read」メンバー関数boost::asio::ip::tcp::socketがなく、無料のものだけがあるのだろうか。

read_someだから私の質問は:メンバー関数はあるがメンバー関数がないという概念的または技術的な理由はありreadますか?

4

2 に答える 2

5

Asio のすべてのストリーミング インターフェイスは、read_someとメソッドの両方を提供しasync_read_someます。これは、TCP ソケット、SSL ストリーム、およびシリアル ポートに当てはまります。read、 、およびそれらの非同期従兄弟の実装は、メソッドread_untilの使用に基づいて、すべて同じ実装を持っています。関数は汎用テンプレートとして記述されており、最初の引数でメソッドを使用してread_some、要求どおりに呼び出しを実行できます。readread_some

クラスの実装が変更されたときの変更を最小限に抑えるために、可能な限り非フレンド非メンバー関数を使用することを推奨する C++ 支持者がいます。 read_someはインターフェイスでありread、さまざまなソースの部分読み取りの場合にブロッキングを追加する単なるラッパーです。

于 2013-01-17T16:52:54.777 に答える
3

Dave S が言うように、これらは boost\boost\asio\read.hpp の外部ヘルパー関数として見つかります。

boost 1.52 asio の例を見ると、blocking_tcp_echo_clientblocking_tcp_echo_serverの例では、write(). この例ではread_some()、サイズを事前に把握していないため使用しています...ただし、書き込み機能は、読み取りの質問と完全に類似しており、.write.hppと同じ場所にヘルパーとしても存在しread.hppます。

基本的:

 tcp::socket s(io_service);
 char buff[LENGTH];
 boost::asio::write(s, boost::asio::buffer(buff, LENGTH));
 boost::asio::read(s, boost::asio::buffer(buff, LENGTH));
于 2013-01-17T17:16:56.983 に答える