2015-07-15 7 views
1

Im пытается подключиться к моему маршрутизатору внутри локальной сети. До сих пор я использовал TcpClient.C# TcpClient Timeout

Проверьте мой код:

public static void RouterConnect() 
     {  
      TcpClient tcpClient = new TcpClient("192.168.180.1",23); <-- Timeout comes up here 
      tcpClient.ReceiveTimeout = 2000; // Not working 
      tcpClient.SendTimeout = 2000; // Also not working 
      NetworkStream nStream = tcpClient.GetStream(); <-- thought Timeout would raise here 

      // Further code here. But already tested while commented out. 
      // So everything else expect the code above shouldnt be relevant. 
     } 

Я хотел бы добавить настройки-формы (маршрутизатора IP/пользователь/пароль). Следовательно, может возникнуть сбой на стороне пользователя, где пользователь вводит не существующий хост-ip.

Текущее время составляет около 20 секунд, что слишком высоко. TcpClient.ReceiveTimeout и TcpClient.SendTimeout arnt - правильные тайм-ауты, как я уже пробовал. Google не помогал мне в этом.

Итак, кто-нибудь знает, как установить таймаут в правильном направлении для этого? Я читал об асинхронном режиме. которые я бы не хотел использовать. Было бы здорово установить 1-строчный тайм-аут. Возможное?

Большое спасибо!

Edit 1: При ближайшем рассмотрении во время отладки я заметил, таймаут уже воспитывающей при инициализации TcpClient (в редакции выше в моем коде) не так как я думал раньше на .GetStream().


EDIT РЕШЕНИЕ:

Поскольку никто не отвечал рабочий код из решения я выбрал, вот как его работы:

public static void RouterConnect() 
     { 
      TcpClient tcpClient = new TcpClient(); 
      if(tcpClient.ConnectAsync("192.168.80.1",23).Wait(TimeSpan.FromSeconds(2))) 
      { 
       NetworkStream nStream = tcpClient.GetStream(); 
      } 
      else 
      { 
       MessageBox.Show("Could not connect!"); 
      } 
     } 
+0

Где вы читаете информацию из потока? – cubrr

+0

Он приходит позже, но не имеет значения. Я прокомментировал чтение. Тайм-аут появляется, как показано в моем отредактированном коде выше при инициализации tcpClient. – C4u

+1

Этот конструктор 'TcpClient' также [подключает клиент] (https://msdn.microsoft.com/en-us/library/115ytk56 (v = vs.110) .aspx) к конечной точке. – cubrr

ответ

1

Единственный способ я знаю, использовать методы ASync. В .NET есть новый новый метод async.5, который возвращает задачу, которую вы могли бы подождать:

tcpClient.ConnectAsync().Wait(timeout) 

Он возвращает ложное, если это не удается.

+0

Проверьте это. Его то же самое, что и кубрр в комментариях по моему вопросу. – C4u

0

Да чистейшая, как я полагаю, будет использовать метод TcpClient .BeginConnect .

Итак, у вас будет асинхронная обратная связь, можете ли вы подключиться к конечной точке или нет. Также см. Это: Async Connect

+0

Что касается вашего Редактирования: Да, организатор также вызывает соединение. В качестве альтернативы вы могли бы назвать пустой конструктор, а затем использовать Connect или BeginConnect. – darkfirewave

0

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

Кроме того, На объектах TcpClient нет объектов для управления тайм-аутом TcpClient.

От MSDN: TcpClient(String, Int32)

Инициализирует новый экземпляр класса TcpClient и подключается к указанному порту на указанном хосте.

Альтернативный код из Social MSDN

using (vartcp = new TcpClient()) 
{ 
    IAsyncResult ar = tcp.BeginConnect("192.168.180.1", 23, null, null); 
    System.Threading.WaitHandle wh = ar.AsyncWaitHandle; 
    try 
    { 
     if (!ar.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2), false)) 
     { 
      tcp.Close(); 
      throw new TimeoutException(); 
     } 

     tcp.EndConnect(ar); 
    } 
    finally 
    { 
     wh.Close(); 
    } 
} 
+0

Хорошо выглядели на первом шаге. К сожалению, он остается на 20 секунд. – C4u

+1

Эти свойства таймаута не влияют на метод 'Connect'. – cubrr