2011-07-28 17 views
1

私はboost::asioを使ってTCPクライアントを書いています。私はバイナリ表現で浮動小数点数の配列を送信したいです。 boostはboost :: arrayなどで配置するためのバイナリ表現にデータを変換する良い方法を提供していますか?boost :: asioを使って生のバイナリデータを送る方法

私は過去にQt QDataStreamを使用していました。私はブーストに何か同等のものがあると確信している

答えて

2
#include <boost/asio.hpp> 

#include <boost/foreach.hpp> 
#include <boost/lexical_cast.hpp> 

#include <iostream> 

int 
main(unsigned argc, char** argv) 
{ 
    if (argc < 3) { 
     std::cerr << "usage: " << argv[0] << " host port" << std::endl; 
     exit(EXIT_FAILURE); 
    } 

    boost::array<float, 5> foo = {1.0, 2.0, 3.0, 4.0, 5.0}; 
    BOOST_FOREACH(const float i, foo) { 
     std::cout << i << std::endl; 
    } 

    boost::asio::io_service ios; 
    boost::asio::ip::tcp::socket socket(ios); 
    socket.connect(
      boost::asio::ip::tcp::endpoint(
       boost::asio::ip::address::from_string(argv[1]), 
       boost::lexical_cast<unsigned>(argv[2]) 
       ) 
      ); 

    const size_t bytes = boost::asio::write(
      socket, 
      boost::asio::buffer(foo) 
      ); 
    std::cout << "sent " << bytes << " bytes" << std::endl; 
} 

応答のための

bash-3.2$ g++ -I /opt/local/include -L/opt/local/lib -lboost_system -Wl,-rpath,/opt/local/lib array.cc 

実行

bash-3.2$ ./a.out 127.0.0.1 1234 
1 
2 
3 
4 
5 
sent 20 bytes 
bash-3.2$ 

サーバー

bash-3.2$ nc -l 1234 | hexdump -b 
0000000 000 000 200 077 000 000 000 100 000 000 100 100 000 000 200 100 
0000010 000 000 240 100             
0000014 
bash-3.2$ 
+0

ありがとう、これは役に立ちます。 1つの質問 - メッセージの先頭にintを付加したいとします(どのフロートが何回フォローしているかを示すため)。これはどのように行われますか? – Gareth

1

あなたは、ファイルへのデータの任意の並べ替えを書くことができると同じように、ASIOを介してデータの任意の並べ替えを送ることができます。

T x; // anything 
const char * px = reinterpret_cast<const char*>(&x); // no type punning, cast-to-char is allowed 

boost::asio::async_write(my_socket, boost::asio::buffer(px, sizeof(T)), ... 

それとも単にファイルへの書き込み:任意の鋳造

std::ofstream f("data.bin"); 
f.write(px, sizeof(T)); 

変数をchar*にすることは、バイナリデータをファイルやソケットなどにシリアル化できる必要があるため、おそらく標準によって明示的に許可されています。

+0

感謝をコンパイルします。私はchar *へのキャストを理解していますが、それを行うための適切なC++の方法を見てうれしいです。これをどのように配列に拡張すればよいですか?これは、各フロートをchar *にキャストし、その4バイト(または何でも)をメッセージバッファに追加するという、反復処理のプロセスですか?私はこれが基本的な質問のように思えますが、私は正しい方法でそれをやっていることを確認したかったのです。 – Gareth

+0

もしそれが裸のC配列であれば、C配列がメモリに連続して格納されているので、 '&x [0]'を 'char *'にキャストし、サイズを 'sizeof(T)'に配列長を掛けた値にする必要があります。 –