【问题标题】:HTTP proxy detecting HTTP client disconnectionHTTP 代理检测 HTTP 客户端断开连接
【发布时间】:2012-05-31 04:50:21
【问题描述】:

我是 HTTP 新手,正在开发一个应用代理。 我想避免为操作定义超时,而是依靠客户端来关闭连接。 我想知道这是否可能?

这是一个非常愚蠢的伪代码

void handle_request(Request http_request, Response http_response)
{
   string modified_request = parse(http_request);
   response_from_server = remote_server->send_request(modified_request);
   while(true) {
     if(response_from_server ->wait_for_data(1000 /* milliseconds */)) {
       http_response->write_data(response_from_server->read_data());
       continue;
     }

     if(!http_response.check_if_the_client_connection_to_me_is_still_active()) // how to do this?
         return;
     }
   }
}

另一种提问方式是:

  1. 在 HTTP 代理中,我可以使用来自远程客户端和远程服务器的超时而不添加另一个超时吗?
  2. 如何检测远程服务器或远程客户端超时?

顺便说一句,我正在使用 Poco 进行 C++ 开发。

【问题讨论】:

    标签: c++ http networking keep-alive poco-libraries


    【解决方案1】:

    如果不使用超时,您无法编写严肃的 TCP 应用程序。在某些情况下,它们是您在阅读时检测断开连接的唯一方法。 TCP 提供以下方法来检测断开的连接:

    1. 读取的各种 EOS 条件。
    2. 写入或偶尔读取时出现“连接重置”。
    3. 读取超时。

    就是这样。没有了。

    您还应该从终端启用 TCP keepalive,但这只会在两个小时后启动。

    【讨论】:

    • 错了。 1.依靠RST+keep-alive通常足以检测死连接。 2. TCP keep-alive timeout 是可配置的。 3.超时不一定代表有问题,这是协议的问题。 OTOH 一个可能想要一个超时来摆脱空闲客户端(保持 TCP 连接,但在应用级别上不响应的客户端)。
    • @valdo (1) 默认情况下,TCP keepalive 仅在两小时后运行。代理需要对死连接做出比这更多的响应。 (2) TCP 超时确实是可配置的,对于整个系统, 即每个连接,如果你有必要的权限。这既不可取,在大多数情况下也不实用。
    • 至少在 Windows 中,使用 winsock2 API,可以(并且应该)为每个套接字配置 TCP keep-alive。 WSAIoctl with flag=SIO_KEEPALIVE_VALS
    • 我不确定这是否能回答问题。再读一遍伪代码。
    • @valdo '通常足够' 还不足以让我写错。我见过整个服务器宕机并且客户端读取被阻塞几天的情况,因为没有收到 RST。读取超时将在几秒钟内以 100% 的可靠性检测到它。
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 2014-04-14
    • 2013-06-21
    • 2021-05-11
    • 2020-01-15
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    相关资源
    最近更新 更多