2017-06-22 105 views
0

我正在開發一個HTTPS服務器,它接收到一個請求並且必須回答3個響應。前兩個是線路確認,最後一個包含請求的信息。從boost asio發送多個響應給該瀏覽器

我正在使用我的網絡瀏覽器(chrome)作爲客戶端。我想要的是以下內容:

  • 瀏覽器(客戶端)向服務器發送請求。
  • 服務器發送第一個ACK(一個html頁面),瀏覽器顯示它。
  • 兩秒鐘後,服務器發送另一個ACK(一個不同的html頁面),瀏覽器顯示它。
  • 再過兩秒鐘後,服務器發送請求的信息(不同的html頁面),瀏覽器顯示它。

的問題是,瀏覽器只接收第一ACK,似乎它是看完後關閉套接字,甚至在HTTPS頭中的Connection設置爲keep-alive

有什麼辦法可以等待幾個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_RCVTIMEOSO_SNDTIMEO)。

注意:保持活動連接在HTTP/1.1中默認啓用,而不在HTTP/1.0中啓用。 HTTP/1.0旨在在客戶端和服務器之間的每個請求之後關閉連接。我們實際上可以使用telnet檢查這種差異。

從性能角度來看,我編寫了兩個(python)腳本 - 一個使用同一個連接連續處理50個請求,併爲每個請求啓動一個新連接。

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

這是近3個數量級的差別這是有道理的,因爲我們知道有保活/永久連接,三次握手(延遲一個完整的往返)是可以避免的。慢啓動在這裏沒有太大的影響,因爲請求和響應非常小,所以帶寬需求量非常低。

PS:去通過this的情況下,它可以幫助

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

客戶需要保留的端口開放的服務器配置(假定的預)聽一個特定的應用程序在一個特定的端口

我從here得到了上面的代碼片段

+0

如何在boost中實現「同一連接中的50個連續請求」? – Dan

+0

嘗試'烏鴉'鏈接是在答案 –

+0

我認爲這將有助於http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/socket_base/keep_alive.html –

相關問題