【发布时间】:2015-01-27 21:02:50
【问题描述】:
我正在使用 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
或者更好的问题是,哪个最适合处理握手消息,哪个最适合在握手通过后处理普通消息(数据帧和其他东西)。
【问题讨论】:
标签: c++ boost websocket boost-asio