我如何读取boost :: asio中的数据包,例如0x01,当前代码我只读取文本:
m_socket.async_read_some(boost::asio::buffer(buffer),
strand.wrap(boost::bind(&Client::handleRead, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)));
感谢
答案 0 :(得分:1)
您可以使用int变量分配缓冲区,而不是使用从socket
中读取的值int m_hdr_size = 0; // this var must be not local
boost::asio::async_read_some(
boost::asio::buffer(reinterpret_cast<char*>(&m_hdr_size), size_t(4))...
如果我理解你的问题。只需将变量和大小设置为缓冲区
即可http://think-async.com/Asio/boost_asio_1_3_1/doc/html/boost_asio/reference/buffer.html
答案 1 :(得分:0)
怀疑一年之后你需要这个答案,但是对于普通大众来说:
在您的代码中,缓冲区通过引用传递。这样,当asio异步调用你的读处理程序(Client::handleRead
)时,它会将该缓冲区的内容更新为它收到的内容。
缓冲区只是具有指定大小的数组。 Asio不会填充缓冲区超过您在boost::asio::buffer(ptr, size)
中指定的大小,因此如果您需要32位整数,则将指针传递给大小= 4字节的数组的开头,然后将其转换为调用读处理程序时的32位int类型(uint32_t
可能是stdint.h
)。
当您不需要整个32位整数时,通常可以通过传递16位或8位来节省大量内存。 uint8_t
和uint16_t
可以让您无需担心架构的int
是否为32位。