2013-08-21 147 views
1

我的異步連接的代碼是非常基本的,並且如下:客戶端套接字無法連接,但不拋出SocketException

private Socket _socket; 
public void Connect(IPEndPoint remoteEndPoint, bool persistentConnection) 
{ 
    _logger.Trace("Attempting To Connect To " + remoteEndPoint.Address); 
    _remoteEndPoint = remoteEndPoint; 
    _persistentConnection = persistentConnection; 

    _socket = new Socket(AddressFamily.InterNetwork, 
         SocketType.Stream, 
         ProtocolType.Tcp); 

    _socket.BeginConnect(_remoteEndPoint, ConnectCallback, null); 
} 

Connect()方法是伴隨着ConnectCallback()這是在那裏我將描述該問題很快出現:

private void ConnectCallback(IAsyncResult asyncResult) 
{ 
    try 
    { 
     _socket.EndConnect(asyncResult); 
     _logger.Trace("Successfully Connected To " + _remoteEndPoint.Address); 
    } 
    catch (SocketException) 
    { 
     _logger.Trace("Failed To Connect To " + _remoteEndPoint.Address); 
     if (_persistentConnection) 
     { 
      Thread.Sleep(TimeSpan.FromSeconds(3)); 
      Connect(_remoteEndPoint, true); 
      return; 
     } 
    } 

    _socketWriter.AssignSocket(_socket); 
    _socket.BeginReceive(..); 
} 

我的網絡代碼在單個組件內封裝。今天我決定從另一個應用程序中引用程序集,發現ConnectCallback方法的行爲非常奇怪。

服務器應用程序未運行時,我打電話給Connect()。這意味着連接成功的可能性不大。由於遠程端點不可用,我期望EndConnect會引發異常。相反,EndConnect似乎成功,因爲即使套接字沒有真正連接,我的代碼仍會繼續調用_socket.BeginReceive,這當然會引發異常,因爲套接字未連接。

特別奇怪的是,如果我在開頭try大括號處放置一箇中斷點並逐步執行回調代碼,則引發和處理異常。

這發生在本地主機上。

爲什麼我遇到這種行爲,我如何確保EndConnect引發SocketException連接是否無法一致建立?

+0

請將一個完整的,可運行的示例演示這種行爲 - 也嘗試更改端口,以確保當您不認爲自己是真正運行服務器時。很明顯,C#方法沒有被破壞。 – xaxxon

回答

0

如果_persistentConnection爲true,那麼只能從catch返回。如果不是,反正你打電話BeginReceive()

相關問題