2011-02-02 5 views
1

私はこの機能を使用して私にデータを送信するクライアントを持っている:はブーストを使用して圧縮されたデータを受信:: ASIO

void CServerRetrieve::Send(char *buf, DWORD size, int flags) 
{ 
    unsigned char *zlib; 
    unsigned long szzlib; 
    m_zlib.Deflate((unsigned char*)buf, size + 1, &zlib, &szzlib); // include the terminating 0 char 
    char zbuf[5]; 
    zbuf[0] = 'Z'; 
    memcpy(&zbuf[1], &szzlib, 4); 
    send(m_Socket, zbuf, 5, flags); 
    send(m_Socket, (char*)zlib, szzlib, flags); 
    delete [] zlib; 
} 

私はブーストを使用してこのデータを受信したい:: ASIO、しかし私は確かにどのようなタイプのではありませんよバッファーはこのデータを受け取るためにsocket.async_receiveに渡す必要がありますか?

私はstd::vector<char>std::vector<std::string>を試しましたが、私のバッファにはデータは一切受信されませんでしたか?

私が間違っていることについて誰かが私を助けることができますか?

void tcp_connection::start() 
{ 
    socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 
} 

void tcp_connection::handle_read(const boost::system::error_code& err, size_t bytes_transferred) 
{ 
    if (!err || err == boost::asio::error::message_size) 
    { 
     size_t sz = buff.size(); //always 0! 
    } 
} 
+2

私はデータの圧縮された問題では、とは何の関係もないと信じてio_serviceにあなたのソケットをバインドのように、あなたがio_service ::実行またはio_service :: run_oneか – Arunmu

+0

と呼ばれているかどうか私達は...この上のより多くのコードが必要実際にはデータを受け取っていません。 – CharlesB

+0

私はあなたのhandle_read関数でerror_codeを取得していると思います。そのerror_codeが対応するものを確認してください。しかし、やはり、あなたはasioの機能を使っているコードよりも少なくとも多くのコードを提供するべきです。 – Arunmu

答えて

1

実際に圧縮データを受け取っているという事実は、Boost.Asioにとって重要ではありません。受信しようとしているデータのサイズを知っていると仮定すると、圧縮データを受信するのに、std::vector<char>は問題ありません。 async_receiveを呼び出す前にresizeにする必要があります。補完ハンドラが呼び出されるまで、このバッファが有効範囲外にならないようにしてください。この概念は、async_readdocumentationに説明されています。

バッファ

つ以上のデータの読取り先バッファ。バッファサイズの合計 は、ストリーム から読み取る最大バイト数 を示します。バッファ オブジェクトは、必要に応じてコピーすることができるが、根本的なメモリ ブロックの 所有権は、呼び出し側によって保持され、 ハンドラが呼び出されるまで、彼らは 有効なままであることを保証しなければなりません。

0

私はbuffがあなたのstd :: vectorであると仮定していますか?その場合には、async_receive前にあなたはおそらく、あなたが受けようとしているメッセージのサイズを知っている場合にもasync_readを使用することを検討すべきである

buff.resize(5); 

のように、あなたが読むことを意図するサイズでこれを初期化する必要があります。いずれの場合でも、あなたのバッファのサイズを設定する必要があります。