Как проверить, слушает ли сервер без обработки исключений - PullRequest
4 голосов
/ 23 ноября 2010

Я работаю над двумя приложениями, которые подключаются друг к другу через TCP.В какой-то момент один из них пытается подключиться, используя TcpClient, но другое приложение еще не гарантировано начало прослушивания (используя TcpListener).

Моя первая попытка была такой:

TcpClient c = null;
while (true)
{
    try
    {
        c = new TcpClient();
        c.NoDelay = true;
        c.Connect( ip, port );
        break;
    }
    catch (SocketException ex)
    {
        Console.WriteLine(string.Format("Could not connect to {0}:{1}, retrying...", ip, port));
        Thread.Sleep( 500 );
    }
}

Однако проблема в том, что он основан на обработке исключений, что немного неприятно для меня, потому что я настроил VS на перехват любых сгенерированных исключений (меню «Отладка -> Исключения ...»).Поэтому каждый раз, когда он пытается подключиться, он разбивается на VS, и мне приходится нажимать «продолжить».

Исключение, которое я получаю:

Невозможно установить соединение, поскольку целевая машина активноотклонил его 127.0.0.1:50000

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

Или что-то вродеthis:

TcpClient tcpClient = new TcpClient();
while ( !tcpClient.TryConnect(....) )
{ Thread.Sleep(1000); }

Аналогично этому:

if (bool.TryParse( "false" ))
{ ... }

Я также пытался использовать асинхронные методы (Begin / End Connect) и устанавливать время ожидания для ManualResetEvent вручную, но это неработать тоже.Я искал интернет, но мне не удалось найти решение этой проблемы, поэтому я, наконец, публикую здесь:)

Ответы [ 2 ]

4 голосов
/ 23 ноября 2010

Проблема в том, что VS ломается на Исключении?Вы всегда можете заставить VS игнорировать определенное семейство исключений.

В VS в меню отладки выберите «Исключения ...», и в представленном диалоговом окне вы можете управлять этим.

1 голос
/ 23 ноября 2010

Я собирался предложить не перехватывать исключение, поэтому прежде чем я предложил протестировать его сам, и если вы установите его, чтобы выбрасывать все исключения, даже если вы не выбрасываете исключение, все его исключения по-прежнему выбрасываются. Мне придется согласиться с Шив Кумаром: либо отрегулируйте свои настройки во время отладки приложения, либо примите ограничения на то, что вы делаете.

Причина, по которой bool.TryParse работает, заключается в том, что он проверяет каждый символ, подобно тому, как Int32.TryParse проверяет, чтобы каждый символ в строке был 0-9 или любой другой допустимый числовой символ.

Конечно, вы можете написать свой собственный сетевой класс и не создавать исключение при сбое соединения.

TryParse не сгенерирует исключение, вы должны перехватить любое исключение, которое выдается, если вы используете bool.Parse с помощью try {} catch {}, в противном случае, если вы попытаетесь проанализировать что-то, не являющееся логическим значением, оно сгенерирует необработанное исключение , TryParse был добавлен позже в истории .NET, Parse - более классический метод, позволяющий программисту обрабатывать все непредвиденные данные и проверять ввод перед попыткой анализа данных.

Я должен добавить, что TryParse вернет false, если не удастся проанализировать значение как результата метода false, так и переменной out, которую я считаю ложной. По крайней мере, это относится к Int32

http://msdn.microsoft.com/en-us/library/system.boolean.tryparse.aspx

Полагаю, смысл того, как работают TryParse и Parse, заключается в том, что они совершенно разные звери по сравнению с TcpClient. Полагаю, мне следует уточнить, что базовый процесс проверки похож, за исключением того, что один выдает исключение, а другой - нет, и, конечно, один возвращает то, что было фактически проанализировано.

...