2017-01-22 4 views
0

Ich versuche, einen Client mit einem Server mit einem asynchronen Socket in C# zu verbinden.Socket Beginconnect mehrere Male für den gleichen Socket, während nicht verbunden

Ich mache socket.beginconnect zu versuchen, eine Verbindung herzustellen, der Punkt ist, dass, wenn die Verbindung nicht hergestellt wird, möchte ich versuchen, connect zu beginnen, und wenn die Verbindung in 500ms nicht hergestellt wird, würde ich gerne Probieren Sie es erneut aus, sagen wir mal 10 mal.

Ich versuchte einen einfachen bucle, aber es funktioniert nicht, weil ich Verbindung nicht wieder beginnen kann, bis die vorherige beendet ist, aber wenn die Verbindung beginconnect beendet und den Server nicht findet, gibt es eine Erwartung, dass es keinen Server gibt.

Antwort

1

MSDN Dokumentation sagt, dass:

Um einen ausstehenden Aufruf der Beginconnect Methode, schließen Sie den Sockel abzubrechen. Wenn die Close-Methode aufgerufen wird, während ein asynchroner Vorgang in fortschreitet, wird der Callback aufgerufen, der der BeginConnect-Methode bereitgestellt wird. Ein nachfolgender Aufruf der EndConnect-Methode löst eine ObjectDisposedException aus, um anzuzeigen, dass die Operation abgebrochen wurde.

Also muss man jedes Mal einen neuen Socket erstellen:

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; 
} 
Verwandte Themen