2011-10-16 9 views
8

最近私のソケットにboost::asioを使用することに決めましたが、問題が発生しています。ドキュメントが不足しているようです。 boost :: asioのwrite()でrawデータを送信する

  • すべてのバイトの後にオペコードのためのすべてのバイトを符号なし整数(uint16_t)の

    • 2バイト:私は何をしたいか

      は、次のような構造からなるメッセージを送信する関数を記述です(柔軟な量)は任意のタイプのデータです(キャストはvoid*)。このオペコードは、おそらくOPCODE_LOGINとして定義される、1であればデータは、例えばオペコード

    に基づいてオペレートする、次にオペコード次のバイトは、ログイン情報を含む文字列を含むことができる、等

    bool sendMessage(tcp::socket* sock, uint16_t opcode, void* data) 
    { 
        void* fullData = malloc(sizeof(uint16_t) + sizeof(data)); 
        memcpy(fullData, (void*)opcode, sizeof(opcode)); 
        memcpy(&fullData + sizeof(uint16_t), data, sizeof(data)); 
        boost::asio::write(sock, boost::asio::buffer(fullData, sizeof(fullData))); 
        // by the way, at this point, is it safe to delete fullData to prevent memory leaks? 
        return true; 
    

    }

    これはコンパイルされません。私が書くの呼び出しに関する不可解なコンパイルエラーを取得する:あなたが見ることができるように

    1>------ Build started: Project: client, Configuration: Debug Win32 ------ 
    1> main.cpp 
    1>c:\boost\boost_1_47\boost\asio\impl\write.hpp(46): error C2228: left of '.write_some' must have class/struct/union 
    1>   type is 'boost::asio::basic_stream_socket<Protocol> ' 
    1>   with 
    1>   [ 
    1>    Protocol=boost::asio::ip::tcp 
    1>   ] 
    1>   did you intend to use '->' instead? 
    1>   c:\boost\boost_1_47\boost\asio\impl\write.hpp(59) : see reference to function template instantiation 'size_t boost::asio::write<SyncWriteStream,ConstBufferSequence,boost::asio::detail::transfer_all_t>(SyncWriteStream &,const ConstBufferSequence &,CompletionCondition,boost::system::error_code &)' being compiled 
    1>   with 
    1>   [ 
    1>    SyncWriteStream=boost::asio::ip::tcp::socket *, 
    1>    ConstBufferSequence=boost::asio::mutable_buffers_1, 
    1>    CompletionCondition=boost::asio::detail::transfer_all_t 
    1>   ] 
    1>   c:\users\josh\documents\visual studio 2010\projects\client\client\main.cpp(53) : see reference to function template instantiation 'size_t boost::asio::write<boost::asio::ip::tcp::socket*,boost::asio::mutable_buffers_ 1>(SyncWriteStream &,const ConstBufferSequence &)' being compiled 
    1>   with 
    1>   [ 
    1>    SyncWriteStream=boost::asio::ip::tcp::socket *, 
    1>    ConstBufferSequence=boost::asio::mutable_buffers_1 
    1>   ] 
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
    

    は、エラーメッセージは自分のコードのいずれかにブーストのwrite.hppファイルに直接指し、そしてません..私は私が呼んでいると信じてwrite()は何らかの方法で間違っていますが、グーグルで調査した参考資料と例(いずれも別のオーバーロードされたwrite()を使用しているか、特定のサイズ/構造のデータを使用しています)の堅実な時間が経過した後、ここで間違っている。

    誰かがこのコンパイルエラーをデバッグする手伝いをしてくれますか?

  • 答えて

    14

    ドキュメントは

    :-)が起動し、ドキュメントについてです

    highest voted questionを欠いているように見える誰かがこのコンパイルエラーをデバッグする私を助けることができますか?

    write()フリー機能expects第1パラメータとして参照型。ポインタあなたはこの時点であなたの例

    bool sendMessage(tcp::socket* sock, uint16_t opcode, void* data) 
    { 
        void* fullData = malloc(sizeof(uint16_t) + sizeof(data)); 
        memcpy(fullData, (void*)opcode, sizeof(opcode)); 
        memcpy(&fullData + sizeof(uint16_t), data, sizeof(data)); 
        boost::asio::write(*sock, boost::asio::buffer(fullData, sizeof(fullData))); 
        //     ^^^^ correct type now 
        // by the way, at this point, is it safe to delete fullData to prevent memory leaks? 
        return true; 
    } 
    

    に持っていないとして、それはメモリリークを防ぐためにfullDataを削除しても安全ですか?

    はい、write() isブロッキングコール。呼び出しが返ったときにバッファで処理されます。私は、このコードの例外を安全にすることを強くお勧めしますが、動的記憶域期間を持つバッファを作成する場合は、newboost::scoped_arrayを調べてください。

    +0

    すごくうれしくありがとう! :)私はグーグルで何度も "最高の投票質問"を何度も見ていましたが、アドバイスに従いましたが、あまり役に立たなかった...例では、write()のさまざまなオーバーロードバージョンを使用しました。私が慣れていないストリームなど。 – Josh1billion

    関連する問題