2017-01-22 7 views
0

Я пытаюсь подключить клиента к серверу с асинхронным сокетом в C#.Socket Beginconnect несколько раз для того же сокета, если он не подключен

Я делаю socket.beginconnect, чтобы попытаться соединиться, дело в том, что если соединение не установлено, я бы хотел, чтобы он попытался начать соединение, и если соединение не установлено в 500 мс, я хотел бы попробуйте еще раз, скажем, 10 раз.

Я пробовал простой куклу, но он не работает, потому что я не могу снова подключиться, пока предыдущий не будет завершен, но когда beginconnect закончит и не найдет сервер, он вернется к выводу, что нет сервера.

ответ

1

MSDN документация говорит, что:

Чтобы отменить отложенный вызов метода BeginConnect, закройте гнездо. Когда вызывается метод Close во время асинхронного действия , вызывается обратный вызов, предоставляемый методу BeginConnect. Последующий вызов метода EndConnect вызовет ObjectDisposedException, чтобы указать, что операция была отменена .

Таким образом, вы должны создать новый сокет каждый раз:

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