Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从boost asio向浏览器发送多个响应_C++_Boost_Https - Fatal编程技术网

C++ 从boost asio向浏览器发送多个响应

C++ 从boost asio向浏览器发送多个响应,c++,boost,https,C++,Boost,Https,我正在开发一个HTTPS服务器,它接收一个请求,并且必须用3个响应进行响应。前两个是行ACKs,最后一个包含请求的信息 我使用我的浏览器chrome作为客户端。我想要的是: 浏览器客户端向服务器发送请求。 服务器将第一次确认发送到html页面,浏览器将显示该页面。 两秒钟后,服务器将另一个ACK发送到不同的html页面,浏览器将显示该页面。 再过两秒钟,服务器将请求的信息发送到另一个html页面,浏览器显示它。 问题是浏览器只接收到第一个ACK,它似乎在读取后关闭套接字,甚至在HTTPS头中将连

我正在开发一个HTTPS服务器,它接收一个请求,并且必须用3个响应进行响应。前两个是行ACKs,最后一个包含请求的信息

我使用我的浏览器chrome作为客户端。我想要的是:

浏览器客户端向服务器发送请求。 服务器将第一次确认发送到html页面,浏览器将显示该页面。 两秒钟后,服务器将另一个ACK发送到不同的html页面,浏览器将显示该页面。 再过两秒钟,服务器将请求的信息发送到另一个html页面,浏览器显示它。 问题是浏览器只接收到第一个ACK,它似乎在读取后关闭套接字,甚至在HTTPS头中将连接设置为保持活动状态

有没有办法在web浏览器中等待几个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;
    }
}

好的,你想克服启动缓慢的问题,即建立一个新的连接,并为新的连接进行三方握手-一个完整的延迟往返

虽然我无法得到一个正确的代码片段,你是如何做到这一点的。一种猜测是,您一定忘了为keep alive连接或使用错误的HTTP版本设置超时SO_RCVTIMEO和SO_sndtTimeo

注意:保持活动连接在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个数量级的差异,这是有意义的,因为我们知道,对于保持活动/持久连接,三方握手避免了延迟的完整往返。在这里,慢启动不会有太大影响,因为请求和响应非常小,所以所需的带宽非常低

附言:如果有帮助的话,请通过

boost::asio::ip::tcp::socket socket(io_service);
...
boost::asio::socket_base::keep_alive option;
socket.get_option(option);
客户端需要保持端口打开,因为服务器被配置为侦听特定端口上的特定应用程序


我从

中获得了上面的代码片段,您能展示一下代码片段吗?我如何在boost中实现同一连接中的50个连续请求?请尝试回答中的crow链接。我认为这会有所帮助