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

Rob*_*ler 2 sockets delphi http keep-alive

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

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

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

我的问题是:

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

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

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

Dav*_*dom 6

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

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

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

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

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

  • 对于HTTP 1.0,客户端可以发送一个`Connection:keep-alive`请求标头来请求持久连接.大多数HTTP 1.0服务器支持将其作为非官方扩展,因为HTTP 1.0中默认情况下不启用"keep-alive".服务器的`Connection`响应头将指示keep-alive是否被尊重. (2认同)