我已经在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计数)在MyCompany.Net.IGTcpClient.Send(字符串消息)
我随机发送了几条消息,我有这个例外。现在,当我收到这个异常时,我会关闭连接并再次打开。我可以从另一段时间发送消息,直到再次引发异常。
当我关闭连接时,我会:
if (_stream != null)
{
_stream.Close();
}
if (_tcpClient != null)
{
_tcpClient.Close();
}
我不知道是什么原因。你知道这个例外的原因吗?
提前感谢
Aron的评论是正确的,您需要关闭这些流。套接字在关闭后会挂一段时间,可能是服务器端已经相信它与客户端有连接,而事实上它没有。使用后关闭流将确保下次"打开"良好。
UPDATE-我正在达到,但将超时值从5秒增加到10秒。