2017-06-22 37 views
0

私はHTTPSのリクエストを受信し、3つの応答で回答する必要があるサーバーを開発中です。最初の2つは何らかの回線ACKであり、最後の1つは要求された情報を含んでいます。ブーストアシオからブラウザに複数の応答を送信

私はクライアントとして自分のウェブブラウザ(クロム)を使用しています。私が欲しいのは次のとおりです。

  • ブラウザ(クライアント)がサーバーに要求を送信します。
  • サーバーが最初のACK(htmlページ)を送信し、ブラウザがそれを表示します。
  • 2秒後、サーバーは別のACK(別のHTMLページ)を送信し、ブラウザはそれを表示します。
  • さらに2秒後、サーバーは要求された情報(別のhtmlページ)を送信し、ブラウザーはそれを表示します。

問題は、あってもHTTPSヘッダにkeep-aliveConnectionを設定、それを読んだ後、ソケットを閉じていると思わ、ブラウザは最初のACKを受信することです。

HTTPSの回答をウェブブラウザで待つ方法はありますか?

ソース

これは請願が行われたときに、サーバーで実行される非同期メソッドが含まれています。

void handle_handshake(const boost::system::error_code& error) 
{ 
    if (!error) 
    { 
     boost::asio::async_read_until(socket_, request_, "\r\n\r\n", 
      boost::bind(&session::handle_read, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     std::cout << "ERROR, deleting. " << __FILE__ << ":" << __LINE__ << std::endl; 
     delete this; 
    } 
} 

void handle_read(const boost::system::error_code& err) 
{ 
    if (!err) 
    { 
     std::string s = "some_response"; 

     // First write. This write is received by the browser without problems. 
     boost::asio::async_write(socket_, 
      boost::asio::buffer(response), 
      boost::bind(&session::handle_write, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     std::cout << "Error: " << err << "\n"; 
    } 
} 

void handle_write(const boost::system::error_code& error) 
{ 
    if (!error) 
    { 
     if(n++ <= 2) 
     { 
     // Second and third writes. 
     // These ones are not read by the browser. 
     if(n == 1) 
     { 
      std::string s = "some_response2"; 

      boost::asio::async_write(socket_, 
       boost::asio::buffer(response), 
       boost::bind(&session::handle_write, this, 
       boost::asio::placeholders::error)); 
     } 
     else if (n==2) 
     { 
      std::string s = "some_response3"; 

      boost::asio::async_write(socket_, 
       boost::asio::buffer(response), 
       boost::bind(&session::handle_write, this, 
       boost::asio::placeholders::error)); 
     } 
     sleep(1); 
     } 
    } 
    else 
    { 
     std::cout << "ERROR, deleting: " << __FILE__ << ":" << __LINE__ << std::endl; 
     delete this; 
    } 
} 
+0

コードスニペットを表示できますか? –

答えて

1

オーケーあなたが新しい接続を取り、3ウェイをやっすなわち、スロースタートを克服したいです新しい接続のためのハンドシェイク - 遅延の完全な往復。

私はあなたがこれをやっている方法の適切なコードスニペットを得ることができませんでしたが。ワイルドな推測では、キープアライブ接続または間違ったHTTPバージョンを使用するためにタイムアウト(SO_RCVTIMEOおよびSO_SNDTIMEO)を設定することを忘れていなければなりません。

注:キープアライブ接続は、HTTP/1.0ではなくHTTP/1.1ではデフォルトで有効になっています。 HTTP/1.0は、クライアントとサーバー間のすべての要求後に接続を閉じるように設計されています。実際にこの違いをtelnetで確認することができます。

パフォーマンスの観点からは、2つのPythonスクリプトを作成しました.1つは50回の連続した要求に対して同じ接続を使用し、1つはすべての要求に対して新しい接続を開始します。

Average time with keep-alive/persistent connections: 7.00 seconds 
Average time with new connections: 22.38 seconds 

それは我々がキープアライブ/持続的な接続を知っているように理にかなって、ほぼ3桁の違いで、3ウェイハンドシェイク(レイテンシのフル往復)が回避されます。リクエストとレスポンスが非常に小さく、必要な帯域幅の量がかなり少ないため、スロースタートはあまり影響を受けません。

PS:ゴーthisによる場合には、それは

boost::asio::ip::tcp::socket socket(io_service); 
... 
boost::asio::socket_base::keep_alive option; 
socket.get_option(option); 

クライアントは、サーバが設定されているように、特定のポート

で、特定のアプリケーションに耳を傾ける(事前仮定)開いているポートを維持する必要があるのに役立ちます

上記のスニペットを入手しましたhere

+0

どのように私は "同じ接続で50の連続した要求"をブーストで実装できますか? – Dan

+0

「crow」のリンクを試してみてください –

+0

私はそれが役立つと思いますhttp://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/socket_base/keep_alive.html –

関連する問題