我在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();
}
我不知道原因。有关这种例外原因的任何想法吗?
提前致谢
答案 0 :(得分:0)
Aron的评论是正确的,您需要关闭这些流。 Socket在关闭后会挂起一段时间,可能是服务器端已经认为它与您的客户端有连接,而事实上它并没有。使用后关闭流将确保下一次良好的“开放”。
更新 - 我到达了,但是将超时值增加到十秒(从五点开始)。