【发布时间】:2020-03-04 17:46:05
【问题描述】:
在 TCP 服务器中,远程客户端可能会决定连接失败(正确或错误)并重新连接到我的服务器。我的服务器完全有可能认为原始连接仍然很好,所以我想检查传入连接以查看它们是否与任何现有连接匹配。
我没有看到比较 Socket 或 TcpClient 实例的明显方法。假设我没有遗漏一些明显的东西,那么正常的方法是什么?这一定是服务器需要处理的一个相当普遍的问题。
例如伪:
TcpListener server = new TcpListener(IPAddress.Any, port);
while(true)
{
TcpClient client = server.AcceptTcpClient();
var oldClient = currentClients.FindMatching(client);
//client must have re-connected for some reason, tidy up
if(oldClient != null)
currentClients.RemoveClient(oldClient);
currentClients.AddClient(client);
}
为了满足显而易见的评论,假设通信协议来自第 3 方并且非常基本:不提供客户端 ID 或心跳/链接检查。它只是发送更新,直到它检测到问题然后重新连接并重新启动 - 所以 TCP 连接处理程序必须检测重复连接
【问题讨论】:
-
我会把它作为通信协议的一部分。我会让客户端在连接时标识自己(证书、guid ......无论如何)。然后您可以查找 id 并查看客户端是否存在“旧”悬空连接。或者甚至不是客户。更好的(虚拟)连接ID。也许在某些时候您需要客户端同时与服务器建立多个连接...
-
当然很好。但我们经常使用现有的通信协议:)
-
“TCP 连接处理程序必须检测重复连接” 是吗?如果客户端有一个“愚蠢的”尝试重新连接策略,为什么不让“静默”连接超时?
-
“为什么不让“静默”连接超时” - 公平地说,我可以压制连接我认为如果它们是陈旧和信任的'不是客户端会重新连接。不错的设计。
-
至少实现起来相当简单。 :D 所以,你可以试试看它是否适合你。