2015-07-15 1 views
1

Je tente de me connecter à mon routeur dans le réseau local. J'ai utilisé le TcpClient jusqu'ici.C# TcpClient Timeout

Vérifiez mon code:

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

Je voudrais ajouter une forme paramètres (routeur IP/utilisateur/mot de passe). Par conséquent, il peut y avoir un échec du côté de l'utilisateur où l'utilisateur tape dans une adresse IP hôte non existante.

Le délai d'attente actuel est d'environ 20 secondes, ce qui est beaucoup trop élevé. TcpClient.ReceiveTimeout et TcpClient.SendTimeout arnt les bons délais pour définir comme je l'ai déjà essayé. Google ne m'aidait pas avec ça. Donc, quelqu'un sait comment régler le délai d'attente de la bonne façon pour cela? J'ai lu sur async. connexions que je ne voudrais pas utiliser. Un nettoyeur 1 ligne-timeout-set serait bien. Possible?

Merci beaucoup!

Edit 1: Avec un peu plus près pendant le débogage j'ai remarqué, le délai d'attente soulève déjà à l'initialisation du tcpclient (comme modifié ci-dessus dans mon code) non pas comme je pensais avant à .GetStream().


EDIT SOLUTION:

Comme personne n'affiché le code de travail de la solution que je pris, voilà comment son travail:

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

Où lisez-vous le flux? – cubrr

+0

Il vient plus tard, mais n'est pas pertinent, je suppose. J'ai commenté la lecture. Le délai d'expiration vient comme vu dans mon code édité ci-dessus à l'initialisation du tcpClient. – C4u

+1

Ce constructeur de 'TcpClient' également [connecte le client] (https://msdn.microsoft.com/en-us/library/115ytk56 (v = vs.110) .aspx) au point de terminaison. – cubrr

Répondre

1

La seule façon que je connaisse est d'utiliser les méthodes Async. Il existe une nouvelle méthode asynchrone dans .Net 4.5 qui renvoie une tâche que vous pourriez attendre comme ceci:

tcpClient.ConnectAsync().Wait(timeout) 

Il renvoie un faux s'il ne réussit pas.

+0

Je vais vérifier. C'est tout à fait le même que cubrr remarqué dans les commentaires sous ma question. – C4u

0

Ouais, je suppose que la manière la plus propre serait être d'utiliser la méthode TcpClient .BeginConnect .

Donc, vous auriez un retour asynchrone si vous pouviez vous connecter au point de terminaison ou non. Voir également ceci: Async Connect

+0

En ce qui concerne votre Edit: Oui, l'onstructor appelle aussi connect. Comme alternative, vous pouvez appeler le constructeur vide, puis utiliser Connect ou BeginConnect – darkfirewave

0

La méthode actuelle de surcharge du constructeur que vous utilisez est également connectée et vous bloque ainsi jusqu'à ce qu'elle soit connectée.

En outre, Aucune propriété sur TcpClient pour contrôler le délai d'expiration TcpClient.

De MSDN: TcpClient(String, Int32)

Initialise une nouvelle instance de la classe TcpClient et donne accès au port spécifié sur l'hôte spécifié.

code alternatif de 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

Bien vu dans la première étape. Malheureusement, il reste à 20 secondes. – C4u

+1

Ces propriétés de délai d'expiration n'affectent pas la méthode 'Connect'. – cubrr