我只是写了一个小小的客户端HTTP应用程序。它只是发送一个GET请求到IP摄像头,然后以jpeg格式接收截图。响应头和非HTTP数据的HTTP分离
现在为了实现HTTP,我使用了Boost Asio。因此,对于第一次尝试,我非常重视sync_client示例Boost Asio Sync HTTP Client Example。
现在主要是我有点担心的标题和数据分离。
首先,我得到响应的第一行:
boost::asio::streambuf response;
boost::asio::read_until(*m_Socket, response, "\r\n");
std::istream response_stream(&response);
std::string http_version;
response_stream >> http_version;
if (!response_stream || http_version.substr(0, 5) != "HTTP/")
{
std::cout << "Invalid response\n";
return;
}
uint32_t status_code;
response_stream >> status_code;
std::string status_message;
std::getline(response_stream, status_message);
if (status_code != 200) // 200 = status code OK
{
std::cout << "Response returned with status code " << status_code << "\n";
return;
}
即日起至这里的一切很清楚,me.I'm读书,直到第一个新行,然后检查东西在我的缓冲区。
现在,我尝试读取头的第二部分:
boost::asio::read_until(*m_Socket, response, "\r\n\r\n");
std::string header;
while (std::getline(response_stream, header) && (header != "\r"))
{
std::cout << header << "\n";
}
std::cout << "\n";
我们这个我有一些问题:
的while循环搜索,直到有一个空白行(唯一的一行
\r
独立)。现在,如果我假定\r
定义了一条新行,为什么我会使用\r\n\r\n
在boost::asio::read_until
?我的意思是我会期望这两者之一,但两者?如果我用
\r\r
作为分隔符调用boost::asio::read_until
方法,它会抛出End of File
异常。这表示在相反的是,因为这是我while循环搜索是寻找一个\r\r
(因为它看起来行之后的行,每行有\r
关闭)
因此,大家可以看到林颇为担心如何在我的标题内划分内容。它变得更加糟糕,因为boost::asio::read_until
调用总是读取比delmiter更远(这实际上是确定的,因为它在文档中提到过),但它仍然有相同的数据跟踪(来自实际的jpeg),具有相同的长度如下。
也许有人可以启发我吗?
我强烈建议您使用[真正的,生产就绪的HTTP解析器](https://github.com/joyent/http-parser)。 – 2012-02-09 15:36:33