如何在boost :: asio中读取数据包

时间:2010-12-04 15:34:42

标签: c++ boost boost-asio

我如何读取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)));

感谢

2 个答案:

答案 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_tuint16_t可以让您无需担心架构的int是否为32位。