2014-01-07 40 views
-1

我已經創建了一個通過TcpClient發送SSL的包裝器。總之,連接我做了這種方式:例外en 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);  

不時,我有此消息的異常:

異常:無法將數據寫入傳輸連接:連接嘗試失敗,因爲連接方在一段時間後未正確響應,或者由於連接的主機未響應而導致建立的連接失敗。

內部異常:連接嘗試失敗,因爲連接的方沒有正確一段時間後響應或已建立的連接和失敗,因爲連接的主機沒有反應

堆棧跟蹤

at System.Net.Sockets.NetworkStream.Write(Byte [] buffer,Int32 offset,Int32 size) at System.Net.Security._SslStream.StartWriting(Byte [] buffer,Int32 offset,Int32 count,AsyncProtocolRequest asyncRequest)在System.Net.Security上的 .SslStream.ProcessWrite(Byte []緩衝區,Int32偏移量,Int32計數,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslStream.Write(Byte [] buffer,Int32 offset,Int32 count) at MyCompany.Net.IGTcpClient。發送(字符串消息)

我發送好幾條消息,然後隨機,我有這個例外。現在,當我收到此異常時,我關閉連接並再次打開。我可以從另一段時間發送消息,直到異常再次提升。

當我關閉連接,我做的:

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

我不知道的原因。有關這個例外的原因的任何想法?

在此先感謝

+0

異常的原因是_in_例外:_「連接嘗試失敗,因爲連接方在一段時間後沒有正確響應,或者由於連接的主機未能響應而建立的連接失敗」_。確保端口可以訪問並且套接字正在監聽。 – CodeCaster

+0

是的,端口可以訪問,並且套接字正在監聽。實際上,我發送了幾封郵件,然後隨機發送,我有這個例外。現在,我關閉連接並再次打開。 – J19

+0

你在使用什麼環境?多少個核心?操作系統版本/版本? IIS/IIS Express?我注意到你沒有關閉你的流,並且在某些配置中你可能只有3個併發流的限制。 – Aron

回答

0

阿龍的評論是正確的,你需要關閉這些流。在關閉之後,Socket會暫停一段時間,並且可能是服務器端已經認爲它與客戶端有連接,但事實上並非如此。使用後關閉流將確保下一次良好的「開放」。

更新 - 我到達,但超時值增加到10秒(從五)。

+0

我已更新主帖以反映此問題。謝謝 – J19