Я просто пишу небольшое клиентское HTTP-приложение.Он просто отправляет запрос GET на IP-камеру, а затем получает снимок экрана в формате jpeg.
Теперь для реализации HTTP я использую Boost Asio.Итак, для первой попытки я в значительной степени ориентировался на пример sync_client Пример использования HTTP-клиента Boost Asio Sync .
Теперь в основном меня немного беспокоит разделение заголовков и данных.
Сначала я получаю первую строку ответа:
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;
}
Теперь, пока все здесь, мне все ясно. Я читаю до первой новой строки, а затем проверяю содержимое в моем буфере.
Теперь я пытаюсь прочитать вторую часть заголовка:
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";
Теперь к этому у меня есть несколько вопросов:
ВремяЦикл ищет, пока не будет пустой строки (единственная строка, где \r
стоит отдельно).Теперь, если я предполагаю, что новая строка определяется как \r
, почему я использую \r\n\r\n
в boost::asio::read_until
?Я имею в виду, ожидал ли я того или другого, но оба?
Если я вызову метод boost::asio::read_until
с \r\r
в качестве разделителя, он выдаст исключение End of File
.Это противоречит тому, что ищет мой цикл while, поскольку он ищет \r\r
(поскольку он просматривает строку за строкой, а каждая строка закрывается с \r
)
Так что, как вы можете видеть, я очень волнуюсь, как разделить вещи внутри моего заголовка.Это становится еще хуже, потому что вызов boost::asio::read_until
всегда читает дальше, чем разделитель (это на самом деле нормально, так как это упомянуто в документации), но все равно он всегда имеет один и тот же след данных (из фактического jpeg), сследующая длина:
Может быть, кто-то мог бы просветить меня?