【问题标题】:How to detect if a connection request is from an existing connected client?如何检测连接请求是否来自现有连接的客户端?
【发布时间】:2020-03-04 17:46:05
【问题描述】:

在 TCP 服务器中,远程客户端可能会决定连接失败(正确或错误)并重新连接到我的服务器。我的服务器完全有可能认为原始连接仍然很好,所以我想检查传入连接以查看它们是否与任何现有连接匹配。

我没有看到比较 SocketTcpClient 实例的明显方法。假设我没有遗漏一些明显的东西,那么正常的方法是什么?这一定是服务器需要处理的一个相当普遍的问题。

例如伪:

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 所以,你可以试试看它是否适合你。

标签: c# tcpclient


【解决方案1】:

如果没有已经为您提供连接或客户端标识符的协议,识别特定客户端并不总是微不足道的。

重申我在 cmets 中给出的方法(因此它们不会丢失):

您说,您的协议是第 3 方,修复且不提供任何类型的标识符。 这意味着,您将不得不求助于 IP、IP/端口等标记,这不是最安全的做法(不知道更多细节)。

考虑到客户端有一个 try-fail-reconnect 策略,您可以跟踪每个连接上的流量。如果连接 X 在 N 时间内没有看到流量,则关闭它。

这是什么意思?

  • 如果客户端脱机,则清理悬空连接。耶!
  • 如果客户端只是静默太久,它将无法发送并重新连接 - 很高兴。
  • 如果客户端错误地放弃了连接并重新连接,您清理现在悬空的连接并仍然收到它的消息 - 也很高兴。

我从一开始就看到的唯一缺点是,如果您必须肯定地识别客户,您仍然必须想办法这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2015-08-04
    • 2013-07-01
    • 2014-04-14
    • 1970-01-01
    • 2019-08-07
    • 2018-06-11
    相关资源
    最近更新 更多