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

Delphi 什么会导致套接字在每次HTTP事务后快速关闭?,delphi,http,sockets,keep-alive,Delphi,Http,Sockets,Keep Alive,我有一个Delphi6应用程序,它与充当HTTP服务器的外部设备通信。我正在为此应用程序使用ICS TWSocket组件。我打开一个套接字与设备进行通信,并处理必要的头和体制作,以便与服务器进行通信。换句话说,我不是在使用ICS HTTP客户端组件,而是在使用较低级别的TWSocket组件,并亲自处理必要的HTTP“握手” 我创建并发送到外部设备的头文件的keep-alive标志设置为TRUE。在我的系统上,在我向外部设备发送任何信息后,连接将持续保持打开状态,直到约30秒的不活动状态发生(30

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

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

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

我的问题是:

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

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

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


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

  • 客户端发出了HTTP/1.0请求
  • 客户端在请求中设置一个
    连接:close
  • 服务器不支持持久连接
HTTP/1.0不支持持久连接,服务器在HTTP/1.0请求后关闭套接字是正确的

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


如果您使用的是HTTP/1.1,则可以通过发送
connection:keep-alive
头来强制连接保持持久(只要服务器支持)。然后还应发送一个
保持活动状态:timeout=,max=
标题,其中
是表示所需行为的整数。

外部设备始终是同一版本,使用相同的配置,并且没有通过某种代理连接?因为好像是由不同的服务器或中间的东西引起的差异,这可能只是HTTP/1在那个特定设备上运行。版本1.0没有持久连接。在任何情况下,wireshark都是您的朋友。首先,请使用Microsoft Network Monitor或wireshark查看连接是如何关闭的(哪一方发送TCP重置),然后您可以开始进一步分析。对于HTTP 1.0,客户端可以发送
连接:保持活动
请求标头以请求持久连接。大多数HTTP 1.0服务器都支持这一非官方扩展,因为HTTP 1.0中默认情况下不启用
保持活动状态
。服务器的
连接
响应头将指示是否遵守“保持活动”。@DaveRandom-请参阅下面的我的评论,并向Remy表示感谢。@RemyLebeau(和Dave)-根据响应头,“HTTP/1.0 200 OK”+“服务器:WYM/1.0”,服务器看起来是HTTP 1.0。我总是有“连接:保持活动”行,但只是在我的请求中添加了“保持活动超时=30 max=3”行。服务器以200 OK状态返回响应头中的以下行:“连接:保持活动”+“保持活动:超时=3600,最大=108000”。尽管有HTTP 1.0支持,但这(必然)表明成功了吗?但是,我检查了用户的调试日志,这两行保持活动状态的代码确实已经从服务器返回。@RobertOschler:响应的版本不能比请求的版本更新。如果请求是HTTP 1.0,则响应将是HTTP 1.0,即使服务器支持较新的HTTP版本。如果响应返回一个
Connection:keep-alive
头,那么该连接在服务器端是持久的,因此客户端可以重用该连接来发送下一个请求。如果客户端等待时间过长,并且在发送下一个请求之前保持活动超时已过,则服务器将关闭连接,发送将失败,在这种情况下,客户端只需重新连接并发送即可。@RemyLebeau-re:request version。我指出了这一点,因为在我尝试将请求更改为HTTP1.1之后,我仍然从服务器返回HTTP1.0。因此,我仍然不知道为什么套接字会关闭,因为尽管服务器支持HTTP 1.0并返回正确的保持活动的行来指示它,但是套接字在每次事务后都会关闭。我将尝试让用户运行WireShark或类似程序,以查看谁正在关闭连接。