SslStream.AuthenticateAsClient或SslStream.Authenti



相关代码

while(true)
{
List<Socket> accept=new List<Socket>{ClientListener.Server,RequestListener.Server};
Socket.Select(accept,null,null,-1);
foreach(var i in accept)
{
if(i == ClientListener.Server)
{
Task.Run(()=>Authenticate(ClientListener.AcceptTcpClient()));
}
else
....
}
}
private void Authenticate(TcpClient client)
{
SslStream ssl=new SslStream(client.GetStream(),false);
try
{
ssl.AuthenticateAsServer(serverCertificate,false,SslProtocols.Tls,true);
ssl.ReadTimeout = 1000;
ssl.WriteTimeout = 1000;
}catch(Exception e)
{
ssl.Close();
client.Close();
ssl.Dispose();
client.Dispose();
return;
}
}

代码是非常基本的代码,但是它有一个非常奇怪的错误。

首先,在服务器启动之初,一切正常。

几乎一个小时后,SslStream.AuthenticateAsServer()抛出错误:从传输流收到一个意外的EOF或0字节

然后,大约三次连接服务器,客户端是SslStream。authenticateasclient抛出错误:从传输流收到一个意外的EOF或0字节。在此之前,客户端身份验证是ok的)

另一个奇怪的事情可能与它有关当我第一次连接服务器时,内存会增加,但在此期间,我不会再次连接它。

您可能正在耗尽系统资源,套接字和/或线程:

while (true)
{
Task.Run(); // Bogus
}

添加using关键字

using SslStream ssl =new SslStream(client.GetStream(), false);

当没有异常时,将释放SslStream

设置呼叫AuthenticateAsServer的超时时间。

不要混用async &同步代码流:等待您正在创建的任务,或者更好,使用AuthenticateAsServerAsync并等待结果Task

最新更新