如何检测连接请求是否来自现有的已连接客户端?

时间:2020-03-04 17:46:05

标签: c# tcpclient

在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);
}

为满足明显的意见,假设通信协议来自第三方,并且非常基础:不提供客户端ID或心跳/链接检查。它只是发送更新,直到检测到问题,然后重新连接并重新启动-因此TCP连接处理程序必须检测重复的连接

1 个答案:

答案 0 :(得分:1)

没有已为您提供连接或客户端标识符的协议,识别特定客户端并不总是一件容易的事。

重申我在评论中给出的方法(这样它们就不会丢失):

您说,您的协议是第三方,已修复,不提供任何种类的标识符。 这意味着,您将不得不求助于IP,IP /端口等标记,这并不是最安全的操作(不了解更多具体信息)。

考虑到客户端具有“尝试-失败-重新连接”策略,您可以跟踪每个连接上的流量。如果连接X在N时间内没有看到流量,则将其关闭。

那是什么意思?

  • 如果客户端脱机,则清理悬空的连接。是的!
  • 如果客户端只是沉默了太长时间,它将无法发送并重新连接-很高兴。
  • 如果客户端错误地放弃了连接并重新连接,则您可以清理悬而未决的连接并仍然收到其消息-也很高兴。

我从一开始就可以看到的唯一缺点是,如果您必须积极地确定客户,那么您仍然必须找出一种方法。

>