【发布时间】:2012-04-05 12:09:52
【问题描述】:
我有一个 Delphi 6 应用程序,它与充当 HTTP 服务器的外部设备通信。我正在为此应用程序使用 ICS TWSocket 组件。我打开一个套接字与设备通信,并处理必要的标头和正文制作以与服务器通信。换句话说,我没有使用 ICS HTTP 客户端组件,而是使用较低级别的 TWSocket 组件并自己处理必要的 HTTP“握手”。
我制作并发送到外部设备的标头将保持活动标志设置为 TRUE。在我的系统上,在我向外部设备发送任何内容后,连接将持续保持打开状态并且不会关闭,直到发生大约 30 秒的非活动状态(30 秒我没有向外部设备发出任何请求作为 HTTP 服务器) .我不知道外部设备是否关闭了它,或者 Microsoft Windows 是否关闭了它。但重要的一点是,通常我可以进行多次发送,并且连接将保持打开状态,直到我在大约 30 秒内什么都不发送。这工作正常,是我的代码所期望的。
但是,在我的一些用户系统上,套接字在每次发送后都会关闭。我确实有代码检查关闭的套接字并在必要时尝试重新连接到外部设备,但不希望每次事务都必须重新连接。
我的问题是:
是否存在可能导致某些用户系统出现这种异常行为的套接字系统设置?
如果是这样,我是否可以使用 Windows API 函数调用来查询有问题的参数,然后将其设置为预期在 30 秒不活动时关闭,而不是在每次交易时关闭?
如果是这样,我能否或如何以不会对用户系统上运行的任何其他程序产生不利影响的方式执行此操作?
【问题讨论】:
-
外部设备总是相同的版本,使用相同的配置,并且没有通过某种代理连接?因为看起来差异是由不同的服务器或中间的东西引起的。
-
这可能只是在该特定设备上运行的 HTTP/1.0。 1.0 版没有持久连接。无论如何,wireshark 是你的朋友。
-
首先,请使用微软网络监视器或Wireshark查看连接是如何关闭的(哪一方发送TCP RESET),然后您可以开始进一步分析。
标签: delphi http sockets keep-alive