2017-06-22 58 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 –

相关问题