我最近决定使用boost::asio我的套接字,但现在我遇到了一个问题:文档似乎缺乏.
我想要做的是编写一个函数,它将发送一个包含以下结构的消息:
uint16_t操作码所有字节的无符号整数()的2个字节 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;
Run Code Online (Sandbox Code Playgroud)
}
但是,这不会编译.关于写入调用,我得到一个神秘的编译错误:
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 ==========
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,错误消息直接指向Boost的write.hpp文件,而不是我自己的任何代码.我相信我write()在某种程度上调用错误,但经过一段时间的谷歌搜索和研究参考和示例(所有哪个使用另一个重载write()或正在使用具有特定定义的大小/结构的数据),我无法确定我在这里做错了什么.
有人可以帮我调试这个编译错误吗?
Sam*_*ler 15
文档似乎缺乏
在最高的投票问题,在升压ASIO是有关文档,从那里开始:-)
有人可以帮我调试这个编译错误吗?
的write()自由功能期望引用类型作为第一个参数.不是你的示例中的指针
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;
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,删除fullData以防止内存泄漏是否安全?
是的,write() is阻止通话.调用返回时,使用缓冲区完成.我强烈建议将此代码异常安全,但是,如果您希望创建具有动态存储持续时间的缓冲区,请查看使用new和a boost::scoped_array.