我最近決定爲我的套接字使用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()
或使用具有特定大小/結構的數據)後,我一直無法確定我究竟是什麼在這裏做錯了。
有人可以幫我調試這個編譯錯誤嗎?
這很好,謝謝! :)我在google搜索中多次看到「最高投票的問題」,並且我遵循了它的建議,但沒有多大效用......這些例子使用了不同的write()重載版本,這個類引用基於許多boost我不熟悉的流等。 – Josh1billion