什么可能导致套接字在每次HTTP事务后快速关闭?

时间:2012-04-05 12:09:53

标签: delphi http sockets keep-alive

我有一个Delphi 6应用程序,它与作为HTTP服务器的外部设备通信。我正在为此应用程序使用ICS TWSocket组件。我打开一个套接字与设备通信并处理必要的标题和正文制作以与服务器通信。换句话说,我没有使用ICS HTTP客户端组件,而是使用较低级别的TWSocket组件并自己处理必要的HTTP“握手”。

我制作并发送到外部设备的标头将keep-alive标志设置为TRUE。在我的系统上,在我向外部设备发送任何内容后,连接将持续保持打开状态,直到大约30秒不活动发生时才会关闭(30秒,我不会将外部设备作为HTTP服务器发出任何请求) 。我不知道外部设备是否关闭它或Microsoft Windows是否关闭它。但重要的一点是,通常我可以进行多次发送,连接将保持打开状态,直到我发送任何内容大约30秒。这很好,是我的代码所期望的。

但是,在我的一些用户系统中,套接字在每次发送后都会关闭。我确实有代码检查已关闭的套接字,并在必要时尝试重新连接到外部设备,但不希望必须重新连接每个事务。

我的问题是:

  • 是否存在可能导致某些用户系统出现此异常行为的套接字的系统设置?

  • 如果是这样,是否有Windows API函数调用我可以用来查询有问题的参数,然后在30秒不活动时将其设置为预期的关闭而不是每次交易?

  • 如果是这样,我可以或者如何以不会对用户系统上运行的任何其他程序产生负面影响的方式进行此操作?

1 个答案:

答案 0 :(得分:6)

服务器正在关闭套接字。这有三个可能的原因:

  • 客户端提出了HTTP / 1.0请求
  • 客户端在请求中设置了Connection: close标头
  • 服务器不支持持久连接

HTTP / 1.0不支持持久连接,并且在HTTP / 1.0请求后关闭套接字时服务器是正确的。

HTTP / 1.1指定连接是隐式持久的,除非客户端指定Connection: close标头。如果收到此标头,服务器在关闭连接时是正确的。如果服务器不支持持久连接,则关闭连接也是正确的。

如果您使用的是HTTP / 1.1,则可以通过发送Connection: keep-alive标头强制连接持久(只要服务器支持)。然后,您还应发送Keep-Alive: timeout=<secs>, max=<max-requests>标头,其中<secs><max-requests>是表示所需行为的整数。