使用boost :: asio中的write()发送原始数据

Jos*_*ion 9 c++ boost-asio

我最近决定使用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

文档似乎缺乏

最高的投票问题,是有关文档,从那里开始:-)

有人可以帮我调试这个编译错误吗?

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.