在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);
}
为满足明显的意见,假设通信协议来自第三方,并且非常基础:不提供客户端ID或心跳/链接检查。它只是发送更新,直到检测到问题,然后重新连接并重新启动-因此TCP连接处理程序必须检测重复的连接
答案 0 :(得分:1)
没有已为您提供连接或客户端标识符的协议,识别特定客户端并不总是一件容易的事。
重申我在评论中给出的方法(这样它们就不会丢失):
您说,您的协议是第三方,已修复,不提供任何种类的标识符。 这意味着,您将不得不求助于IP,IP /端口等标记,这并不是最安全的操作(不了解更多具体信息)。
考虑到客户端具有“尝试-失败-重新连接”策略,您可以跟踪每个连接上的流量。如果连接X在N时间内没有看到流量,则将其关闭。
那是什么意思?
我从一开始就可以看到的唯一缺点是,如果您必须积极地确定客户,那么您仍然必须找出一种方法。
>