2016-12-05 3 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! 
} 

Если другой сервер запущен, но сервис, который прослушивает порт вниз, это по-прежнему возвращает истину! (И если сервер выключен, он правильно выбрасывает исключение)

Почему?

Как это сделать, если служба не работает (и, следовательно, ничто не слушает этот порт)?

ответ

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