sockets - Boost.Asio 的 async_read_some 会是整个消息吗?

标签 sockets c++11 boost-asio

我试图在我的 C++ 程序中通过 http 接收一个包。我为此目的使用 Boost.Asio。

在我的 handleAccept 方法中,我有这个代码来读取包:

    // m_buffer is declared as: std::array<char, 8192> m_buffer;
    auto buf = boost::asio::buffer(m_buffer);
    newConnection->getSocket().async_read_some(
        buf,
        boost::bind(&TcpServer::handleRead, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
    );

这足以获得任何包裹吗?我如何确保它将获得大于 8192 字节的包?

最佳答案

async_read_some读取收到的消息 高达 你给它的缓冲区的大小。接收到的消息中的字节数在 bytes_transferred 中返回。回调函数的占位符,见basic_stream_socket::async_read_some

如果您知道您希望接收的消息的最大大小,您可以简单地使用一个足够大的缓冲区来容纳该消息。否则,您必须复制 async_read_some 的内容。在其他地方缓冲并在那里建立整个接收到的消息。

关于sockets - Boost.Asio 的 async_read_some 会是整个消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44405106/

相关文章:

c++ - 不处理 asio 异步操作

c++ - 如何适本地反检查 Boost 错误代码?

Java Socket和ServerSocket在使用端口上的区别

c++ - 使用 Visual Studio 将静态构建的库链接到共享库的潜在内存风险

javascript - 通过 Websocket() 连接到 socket.io 服务器时不起作用

c++ - 为什么 std::condition_variable 使调度不公平?

C++11 标准::数组

c++ - 在 C++11 中使用异步的分段​​错误(核心转储)

c# - 发送 IP 数据包

mysql - 线程卡在 java.net.SocketInputStream.socketRead0(Native Method) 上,有人知道发生了什么吗?