使用Boost.ASIO [WebSocket]完整阅读消息

时间:2015-01-27 21:02:50

标签: c++ boost websocket boost-asio

我正在使用Boost.ASIO编写一个简单的WebSocket服务器。现在,我正在努力尝试处理握手。我的问题是,它看起来不像客户端发送的握手消息的预定义长度。

我的问题是,当消息结束时,如何停止阅读握手?

我首先尝试了async_read_some,其中我读取了指定的字节数。

void Connection::readMessage()
{
    auto self(shared_from_this());
    w_socket.async_read_some(boost::asio::buffer(w_data, max_length),
        [this, self](boost::system::error_code ec, std::size_t length)  // Lambda function
        {
            if (!ec)
            {
                std::cout << w_data << std::endl;
            }
        });
}

上面的代码给了我这个结果: http://i.imgur.com/LSyfG2U.png

然后我尝试进一步研究并发现async_read_until(读取直到找到连续的新行)暂时修复它以获取握手消息,但这并不能保证它会停止。

void Connection::readMessage()
{
    auto self(shared_from_this());
    boost::asio::async_read_until(w_socket, streambuffer, "\r\n\r\n",
        [this, self](boost::system::error_code ec, std::size_t length)  // Lambda function
        {
            if (!ec)
            {
                std::istream is(&streambuffer);
                std::getline(is, w_data_s);

                std::cout << w_data_s << std::endl;
            }
        });
}

上面的代码给出了这个结果:http://i.imgur.com/JW1dyLH.png

或许可能是一个更好的问题,最好处理握手消息,最好在握手通过后处理普通消息(数据帧和东西)。

1 个答案:

答案 0 :(得分:1)

在这里查看websocket规范:http://datatracker.ietf.org/doc/rfc6455/?include_text=1你走在正确的轨道上。

使用async_read_until来处理握手,因为它具有未定义的长度,但是与http分隔相同,然后,在完成握手后亲自交换实际数据,切换到使用async_read,使用固定长度的预定义头它描述了下一个主体的长度,或指定了你自己的完成条件。如果您不介意以某种固定方式划分邮件,您当然可以继续使用async_read_until。