我有一个TcpListener服务器
,可以通过调用server.AcceptTcpClientAsync()
与客户端建立连接。不幸的是,会有随机的、不需要关心的流量连接到服务器,因此我添加了一个方法Task<bool> Handshake(TcpClient client)
来验证客户端是否应该能够与服务器通信。
获取连接的朴素方式为:
async Task<TcpClient> GetClient(TcpListener server)
{
while (true)
{
var client = await server.AcceptTcpClientAsync();
if (await Handshake(client))
{
return client;
}
client.Dispose();
}
}
不幸的是,握手过程需要一定的时间才能超时等待虚假连接,如果这个时间比下一个连接出现的时间长,那么挂起的连接将会堆积并且无法得到服务。
我知道像Task.WhenAny这样的API可以同时运行多个异步操作,但我似乎无法找到一个适合这种连接过程的模型。
我想要的:
- 只有一个成功的连接被期望。
- 当一个连接到达时,尝试进行握手。 如果握手成功,则返回并且处理任何其他挂起的连接。如果没有成功,则处理该连接。
- 正在进行握手不应阻止循环接受新的连接。
- 握手进行中的数量始终可能为0、1或大于1。
有没有好的方法来用代码表达这个想法?