SSL连接异常

时间:2014-01-07 16:24:55

标签: c# .net ssl tcpclient

我在TcpClient上创建了一个包装器,用于发送SSL。总之,对于连接,我这样做:

Stream _stream = null;

TcpClient _tcpClient = new TcpClient(IPAddress.ToString(), Port);

if (isSsl)
{
    SslStream sslStream = new SslStream(_tcpClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), new LocalCertificateSelectionCallback(SelectLocalCertificate));

    if (Certificate != null)
    {                             
        X509CertificateCollection cc = new X509CertificateCollection ();
        cc.Add (Certificate);
        sslStream.AuthenticateAsClient(_Host, cc, SslProtocols.Default, false);
    }
    else
    {
        sslStream.AuthenticateAsClient(_Host);
    }

    sslStream.WriteTimeout = 5000;                        
    _stream = (SslStream)sslStream;
}
else
{
    NetworkStream networkStream = _client.GetStream();
    _stream = (NetworkStream)networkStream;
}

发送时,我这样做:

_stream.Write(dgram, 0, dgram.Length);      

我不时会收到此消息的例外情况:

例外:无法将数据写入传输连接:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败

内部异常:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败

StackTrace

在System.Net.Sockets.NetworkStream.Write(Byte []缓冲区,Int32偏移量,Int32大小) 在System.Net.Security._SslStream.StartWriting(Byte []缓冲区,Int32偏移量,Int32计数,AsyncProtocolRequest asyncRequest) 在System.Net.Security._SslStream.ProcessWrite(Byte []缓冲区,Int32偏移量,Int32计数,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslStream.Write(Byte []缓冲区,Int32偏移量,Int32计数) at MyCompany.Net.IGTcpClient.Send(String message)

我随机发送好几条消息,我有这个例外。现在,当我收到此异常时,我关闭连接并再次打开。我可以从另一段时间发送消息,直到再次出现异常。

当我关闭连接时,我会这样做:

if (_stream != null)
{
    _stream.Close();
}
if (_tcpClient != null)
{
    _tcpClient.Close();
}

我不知道原因。有关这种例外原因的任何想法吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

Aron的评论是正确的,您需要关闭这些流。 Socket在关闭后会挂起一段时间,可能是服务器端已经认为它与您的客户端有连接,而事实上它并没有。使用后关闭流将确保下一次良好的“开放”。

更新 - 我到达了,但是将超时值增加到十秒(从五点开始)。