私は同期ブーストアシオを使用して読み取り/書き込みを行っています。データは境界なしでバイナリ形式で送られ、長さ情報はパケット形式で符号化されます。したがって、指定されたサイズで読み込むことが重要です。 ip::tcp::iostream
できますか?誰かが例を挙げることはできますか?ありがとう。boost asioを使用してフィックスサイズのパケットを読み取る方法は?
答えて
異なるサイズの異なるデータを送信するプログラムで動作します。私はサイズを取得
enum { header_length = 8 }; //const header length
//give header length
std::ostringstream header_stream
header_stream << std::setw(header_length) //set a field padding for header
<< std::hex //set next val to hexadecimal
<< m_data_out.m_outbound_data.size(); //write size in hexa
m_data_out.m_outbound_header = header_stream.str(); //m_outbound_head == size in hexa in a std::string
//m_outbound_header = [ 8 byte size ]
//m_outbound_data = [ serialized data ]
//write all data in the std::vector and send it
std::vector<boost::asio::const_buffer> buffer;
buffer.push_back(boost::asio::buffer(m_data_out.m_outbound_header));
buffer.push_back(boost::asio::buffer(m_data_out.m_outbound_data));
(m_outbound_dataはスタンダード::文字列==シリアライズオブジェクトれる):Iサイズをエンコードするために8バイトの固定ヘッダを使用し、その後、私は、データを追加します
そして読書のために、あなたは2時間に読む必要がある:第一の大きさを得るために8バイトを読み、その後、ベクトル内のデータを読み取り、オブジェクトにデシリアライズ:
struct network_data_in {
char m_inbound_header[header_length]; //size of data to read
std::vector<char> m_inbound_data; // read data
};
私がデータを取得するために、この構造体を使用し、記入するためにm_inbound_headerでreadを呼び出すサイズのバッファが最初に、そして、ハンドルに:
//get size of data
std::istringstream is(std::string(m_data_in.m_inbound_header, header_length));
std::size_t m_inbound_datasize = 0;
is >> std::hex >> m_inbound_datasize;
m_data_in.m_inbound_data.resize(m_inbound_datasize); //resize the vector
、バッファ上のm_inbound_dataで読み取る再び呼び出して、正確にデータを読み出す。この結果は、あなたがデータをデシリアライズする必要がありジュスト二handle_readで を送りました。
//extract data
std::string archive_data (&(m_data_in.m_inbound_data[0]),m_data_in.m_inbound_data.size());
std::istringstream archive_stream(archive_data);
boost::archive::text_iarchive archive(archive_stream);
archive >> t; //deserialize
希望はあなたを助けよう!
+1良い答え、これは私が提案するものです。フィックス長ヘッダーを含めるようにプロトコルを変更します。あなたのプロトコルを変更することができない場合は、質問にそのように述べてください。 –
TCPはストリームベースのプロトコルです。つまり、読んだものは単なるバイトストリームです。 例を考えてみましょう。固定サイズのメッセージがあり、それをTCP経由で送信します。他端のプログラムはどのようにしてメッセージ全体を読むことができますか? 2つの方法があります.1つは、制御の仕方でメッセージを囲むことです(開始時にはSTX、最後にETXなど)。最初に、プログラムはSTXの前に任意の文字を破棄し、ETXに遭遇するまで他の文字をメッセージバッファに読み込みます。
もう1つの方法は、メッセージ長を固定長のヘッダーにエンコードすることです(これはあなたのケースです)。したがって、メッセージの長さを読み取って解析し、それに応じて残りのバイトを読み取る方法を見つけ出すことが最善の方法です。
私は長さの情報が必要であることを理解しています。明確ではないのは、この長さ(読みたいバイト数)をAPIで指定することです。 – Oliver
@Oliverあなたのコメントは理にかなっていません。読み込むバイト数は、APIの[boost :: asio :: read'](http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/read/)のようによく記述されています。 overload1.html) –
シンプル:*長さ情報はパケット形式でエンコードされた*:
boost::asio::read(socket, buffers, boost::asio::transfer_exactly(your_fixed_size));
- 1. boost :: asio読み取り応答
- 2. C++ Boost ASIO:タイムアウトで読み書きする方法は?
- 3. boost :: asio :: io_service :: run_one()の使用方法
- 4. boost asio udpソケットから特定のデータサイズを読み取る
- 5. boost :: property_tree :: read_xml boost :: asio :: spawnを使用して生成されたasioハンドラのsegfaults
- 6. boost asioを使用してウェブページを取得
- 7. boost :: asio SSLを使用してクライアント証明書を確認する方法は?
- 8. を使ってBOOST ASIOバッファー
- 9. boost asioは読んで100%cpuを取っています
- 10. boost :: asioを使って生のバイナリデータを送る方法
- 11. ブーストライブラリを使用してドットファイルを読み取る方法
- 12. boost :: asio読書のトラブル
- 13. Boost asioを使用したリアルタイムシリアルI/O
- 14. boost :: asioを使用したAF_NETLINK(netlink)ソケット
- 15. Cygwin 64ビットでboost asioライブラリを使用する方法
- 16. 外部メモリアドレスをバッファとしてboost :: asio :: async_read_untilを使用する方法
- 17. boost :: asio UDP Windowsでメッセージを受け取る方法は?
- 18. boost :: asio async_read保証すべてのバイトが読み取られる
- 19. ブーストasio非同期キューを使用してソケットへの読み取りと書き込み
- 20. boost :: asioを使用してネットワーク中断から復旧する方法
- 21. デバイスファイルでasioを使用する方法
- 22. Boost :: Asio読み込み/書き込み操作
- 23. XSJSを使用してユーザーロールを読み取る方法は?
- 24. i2cgetコマンドを使用してi2cを読み取る方法は?
- 25. ajaxを使用してjsonファイルを読み取る方法は?
- 26. VBScriptを使用してiniファイルを読み取る方法は?
- 27. Imagemagickを使用してPNGファイルを読み取る方法は?
- 28. org.apache.commons.configuration2を使用してプロパティファイルを読み取る方法は?
- 29. Javaを使用してシリアルシリアルデータを読み取る方法は?
- 30. javascriptを使用してフォームデータを読み取る方法は?
あなたはどういう意味ですか?プロトコルのフレーミングは通常アプリケーションレベルで行われますが、データのストリームではなくパケットについて考えることで混乱していると思います。 –