私はブーストチュートリアルから次のコードを使用して、サーバからjson文字列を取得しています。boost :: asioに基づいた低速のhttpクライアント - (チャンク転送)
問題は、実行には時間がかかります。つまり、クライアントとサーバーの両方がローカルホスト上にあるためです。私はプログラムの最後の2行を削除する場合は、この中に、つまり:
しばらく(後押し:: ASIO ::読み(ソケット、応答、 ブースト:: ASIO :: transfer_at_least(1)、エラーを))
プログラムは非常に高速に実行されます。何が問題なのでしょうか?
boost::asio::streambuf response;
boost::asio::read_until(socket, response, "\r\n");
std::istream response_stream(&response);
std::string http_version;
response_stream >> http_version;
unsigned int status_code;
response_stream >> status_code;
std::string status_message;
std::getline(response_stream, status_message);
if (!response_stream || http_version.substr(0, 5) != "HTTP/")
{
std::cout << "Invalid response\n";
return 1;
}
if (status_code != 200)
{
std::cout << "Response returned with status code " << status_code << "\n";
return 1;
}
boost::asio::read_until(socket, response, "\r\n\r\n");
// Process the response headers.
std::string header;
while (std::getline(response_stream, header) && header != "\r");
if (response.size() > 0)
std::cout << &response;
// Read until EOF, writing data to output as we go.
boost::system::error_code error;
while (boost::asio::read(socket, response,
boost::asio::transfer_at_least(1), error))
std::cout << &response;
if (error != boost::asio::error::eof)
throw boost::system::system_error(error);
サーバーからいくつかのデータを表示するためのtcpdump
HTTP/1.1 200 OK
Connection: close
Content-Length: 42
Server: C/1.1
Date: Thu, 24 Nov 2016 07:47:27 GMT
{"Out":[1],"In":[1,2,3,4,5,6]}
はい、本当に遅いです。問題はコンテンツの長さに関係していると私は信じています。応答でコンテンツの長さのサイズを正確に読み取るようにコードを修正すると、プログラムは高速に実行されます。 – cateof
@Arunmuサーバーコードにアクセスできません。コンテンツの長さは送信されず、ヘッダーからメッセージがチャンクされていることがわかります。しかし、上記のコードは、接続クローズとコンテンツ長を送信するサーバーに対してもうまく機能しません。 – cateof
ここでは、応答がチャンクされた重要な部分について言及しています:)すべてのチャンクの開始前にチャンクサイズが書かれています。あなたはそれをデコードしてどれくらい読むべきかを知ることができます。あなたはそれについて言及するだけで、多くの時間を節約することができました。 – Arunmu