使用 Boost.ASIO [WebSocket] 完整阅读消息
Read message in its entirety with Boost.ASIO [WebSocket]
我正在使用 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
或者更好的问题是,哪个最适合处理握手消息,哪个最适合在握手通过后处理普通消息(数据帧和内容)。
查看此处的 websocket 规范:http://datatracker.ietf.org/doc/rfc6455/?include_text=1 您走在正确的轨道上。
使用async_read_until处理握手,因为它没有定义长度,但与http一样被分隔,然后,完成握手后亲自交换实际数据,切换到使用async_read 使用固定长度的预定义 header 来描述后续 body 的长度,或者指定您自己的完成条件。如果您不介意以某种固定方式分隔消息,您当然可以继续使用 async_read_until。
我正在使用 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
或者更好的问题是,哪个最适合处理握手消息,哪个最适合在握手通过后处理普通消息(数据帧和内容)。
查看此处的 websocket 规范:http://datatracker.ietf.org/doc/rfc6455/?include_text=1 您走在正确的轨道上。
使用async_read_until处理握手,因为它没有定义长度,但与http一样被分隔,然后,完成握手后亲自交换实际数据,切换到使用async_read 使用固定长度的预定义 header 来描述后续 body 的长度,或者指定您自己的完成条件。如果您不介意以某种固定方式分隔消息,您当然可以继续使用 async_read_until。