2012-05-24 56 views
1

我是HTTP新手,正在开发一个应用代理。 我想避免定义操作超时,而是依靠客户端来关闭连接。 我想知道这是否可能?检测HTTP客户端断开的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; 
    } 
    } 
} 

另一种方式来问这个是:

    在HTTP代理
  1. ,我可以使用超时从远程cilent和远程服务器,而不又增加了一次超时?
  2. 如何检测远程服务器或远程客户端是否超时?

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

回答

1

不能写入一个严重的TCP应用程序而不使用超时。它们在某些情况下是您在阅读时可以检测到丢失连接的唯一方法。 TCP提供以下方法来检测丢失的连接:

  1. 读取的各种EOS条件。
  2. 写入或偶尔读取时出现'连接复位'。
  3. 阅读超时。

就是这样。没有更多了。

您还应该从您的末端启用TCP keepalive,但只有在两个小时后才会启用。

+0

错误。 1.依靠'RST' + keep-alive通常足以检测死连接。 2. TCP保持活动超时是可配置的。 3.超时并不一定表示有问题,这是协议的问题。 OTOH一个*可能*想要暂停空闲客户端(维持TCP连接的客户端,但在应用级别上没有响应)。 – valdo

+0

@valdo(1)TCP keepalive默认只在两小时后运行。代理服务器需要对死亡连接的反应更强。 (2)TCP超时确实是可配置的,*对于整个系统*,即每个连接*,如果你有必要的特权。*这是既不可取也不适用于大多数情况。 – EJP

+0

至少在Windows中,使用winsock2 API,可以(也应该)配置每个套接字的TCP保持活动状态。 'WSAIoctl'与标志='SIO_KEEPALIVE_VALS' – valdo