3

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

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

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

我的问题是:

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

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

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

4

1 回答 1

7

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

  • 客户端发出 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>是表示所需行为的整数。

于 2012-04-05T16:13:06.170 回答