2017-01-22 61 views
0

我試圖用c#中的異步套接字將客戶端連接到服務器。套接字在未連接的情況下爲同一個套接字開始連接

我在做socket.beginconnect嘗試連接,重點是如果連接沒有建立,我想它嘗試開始連接,並且如果連接沒有在500ms建立,我想讓我們再試試10次。

我嘗試了一個簡單的bucle,但它不起作用,因爲我無法再次beginconnect,直到前一個完成,但是當beginconnect完成並且沒有找到服務器時,它返回一個沒有服務器的expecion。

回答

1

MSDN文件說:

取消掛起的調用BeginConnect方法,關閉套接字。 當異步操作處於 進度中時調用Close方法時,將調用提供給BeginConnect方法的回調。 對EndConnect方法的後續調用將拋出 ObjectDisposedException來指示操作已取消 。

所以,你必須每次創建一個新的Socket:

public Socket TryConnect(...) 
{ 
    Socket socket; 

    try 
    { 
     socket = new Socket(...); 
     var connect = Task.Factory.FromAsync(
      socket.BeginConnect, socket.EndConnect, host, port, null); 

     var isConnected = connect.Wait(TimeSpan.FromSeconds(0.5)); 

     if (!isConnected) 
     { 
      socket.Close(); 
      return null; 
     } 

     return socket;  
    } 
    catch 
    { 
     if (socket != null) 
     { 
      socket.Dispose(); 
     } 
     throw; 
    } 
} 


for (var i = 0; i < 10; i++) 
{ 
    var socket = TryConnect(); 
    if (socket != null) 
     return socket; 
}