背景:
我有一些代码连接到服务器以提取数据。但是,在某些时候,程序进入了无法连接到服务器的状态。我们看到的问题是,当我们尝试重新连接时,服务器不断超时。
插件:
我们将超时设置为网络插件(Thrift 插件)使用的默认值。这些值是 100k 毫秒超时和 300k 毫秒读写超时。不完全是短暂的超时。此外,每次尝试重新连接时,我们都会重新创建插件的类,因此每次尝试重新连接时都会重置其内部设置的任何值。我相信超时不是问题。而且我相信插件不是问题。
网络:
我们看到这些重复的超时发生了半个小时。当我们重新启动服务(不是机器)时,它立即恢复在线。所以,我知道这不是网络问题。这让我相信这是我们代码中的某些东西进入了无效的网络状态。此外,这是一种我们无法控制的状态,因为我们的插件对我们隐藏了所有好的网络内容——包括超时、keepalive 标志和连接组(以及其他)。我们基本上无权访问 HTTPWebReqest 成员。
问题:
当我们的网络设置进入此状态时,我们会尝试关闭所有连接并重新连接到服务器。目标是终止所有活动连接,以重置我们进入的任何状态。但是,当我们尝试重新连接时,我们的重新连接会超时。
不知何故(可能是由于我们无法控制的 KeepAlive 和 TCP 流水线),即使我们关闭了所有连接,网络连接仍然保持打开状态。这使我们处于糟糕的状态,并阻止我们循环连接到服务器。
问题:
如何终止与服务器的所有底层连接以强制重新连接?