ちょっとクライアント側のHTTPアプリケーションを書いています。それはちょうどIPカメラにGET Requestを送り、jpegフォーマットのScreenshotを受け取るだけです。レスポンスヘッダーと非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";
:
は、今私は、ヘッダーの第二の部分を読んしようとしているザ・空白があるまでループを探している間に(
\r
が単独で存在する唯一の行)。今では、新しい行が\r
で定義されていると仮定した場合、\r\n\r\n
をboost::asio::read_until
で使用するのはなぜですか?私はどちらかというと、どちらかというと、どちらかというと、どちらかというとどちらかというと、メソッドを
\r\r
として区切り文字にすると、End of File
例外がスローされます。これは\r\r
探しているものは、私のwhileループは、このため、検索しているに反しに立っている(それは行の後の行に見えることから、すべての行が\r
を閉じて)あなたはどのようにイムはかなり心配して見ることができるように
私のヘッダーの中のものを分割する。 boost::asio::read_until
コールはいつもdelimerよりも読み込みが多いので(実際にはOKですが、ドキュメントに記載されているので)、それでもやはりちょっとしたデータ(実際にはjpegから)、同じ長さ
誰かが私を啓発できますか?
[本物の、実稼働環境のHTTPパーサー](https://github.com/joyent/http-parser)を使用することを強くお勧めします。 –