2016-12-05 30 views
3

我對我所通過另一臺服務器上創建一個連接服務:如果偵聽服務關閉,爲什麼TcpClient.BeginConnect結果的AsyncWaitHandle.WaitOne不會返回false?

using (var clientSocket = new TcpClient()) 
{ 
    ... 
    //Connect async 
    var result = clientSocket.BeginConnect(hostIP, portNumber, null, null); 

    //Wait for connection up to our timeout 
    if (!result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5))) 
    { 
     //This is NEVER run 
     throw new Exception("Connection timed out."); 
    } 

    //It makes it here but shouldn't! 
} 

如果其它服務器啓動,但該端口上偵聽的服務關閉,這仍然返回true! (如果服務器關閉,它確實會拋出異常)

爲什麼?

如何讓我如果服務停止它失敗(因此沒有在聽該端口上的)?

回答

0

看來如果沒有什麼可以聽的話就沒有辦法讓它失敗。相反,您可以使用ReadTimeout來處理在另一端聽不到的錯誤。

0

也許你可以使用新的ConnectAsync方法,它甚至允許你提供一個CancellationToken以防你需要你的客戶端連接任務提前中止。

using (var clientSocket = new TcpClient()) 
{ 
    //Connect async and wait for connection up to our timeout 
    if (!clientSocket.ConnectAsync(hostIP, portNumber).Wait(TimeSpan.FromSeconds(5))) 
    { 
     throw new Exception("Connection timed out."); 
    } 
} 
+0

這實際上做不同的事情或者是內部一樣BeginConnect? –

+0

'ConnectAsync'只是一種更現代的異步連接套接字客戶端的方式,而'BeginConnect'似乎更像是一種傳統方法。在這裏看到更詳細的答案:http://stackoverflow.com/a/5765032/633098 – silkfire

相關問題