2011-10-16 162 views
8

我最近決定爲我的套接字使用boost::asio,但現在我遇到了一個問題:文檔似乎缺少。在boost :: asio中使用write()發送原始數據

我想要做的是寫將發送包含以下結構的消息的功能:

  • 所有字節後

    • 2個字節的無符號整數(uint16_t)爲操作碼的所有字節(可變數額)是任何類型的數據(轉換爲void*)。該數據將在基於操作碼

    例如被操作,如果該操作碼是1,或許定義爲OPCODE_LOGIN,然後下面的操作碼字節可以包含含有登錄信息的字符串等

    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 ========== 
    

    正如你所看到的,錯誤消息直接指向到Boost的write.hpp文件,並沒有任何的我自己的代碼。我相信我打電話write()以某種方式不正確,但經過一小時的谷歌搜索和研究參考和示例(所有這些使用另一個重載write()或使用具有特定大小/結構的數據)後,我一直無法確定我究竟是什麼在這裏做錯了。

    有人可以幫我調試這個編譯錯誤嗎?

  • 回答

    14

    文檔似乎缺乏

    highest voted question約爲文檔,從這裏開始:-)

    有人可以幫我調試這個編譯錯誤?

    write()自由函數expects作爲第一個參數的引用類型。不是指針,你必須在你的例子

    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

    這很好,謝謝! :)我在google搜索中多次看到「最高投票的問題」,並且我遵循了它的建議,但沒有多大效用......這些例子使用了不同的write()重載版本,這個類引用基於許多boost我不熟悉的流等。 – Josh1billion