2010-12-13 37 views
0

Actuellement, je travaille sur un projet réseau qui inclut la connexion aux serveurs TCP et à certains périphériques. Pendant longtemps, j'ai utilisé le code ci-dessous pour envoyer des commandes tcp et recevoir des réponses pour certains modèles de périphériques, mais quand je l'essaye pour Windows Telnet Server 2003 et un périphérique Fortigate, même si je peux créer une connexion tcp avec succès est un jeu de caractères comme ??% ?????? '????C# TcpClient ne peut pas lire la réponse valide du serveur/périphérique Telnet connecté avec succès

Ma fonction de la réponse de réception est:

private string receive() 
    { 
     StringBuilder sbReadBuffer = new StringBuilder(); 
     bool isFinished = false; 
     NetworkStream ns = tcpClient.GetStream(); 
     DateTime lastConTime = DateTime.Now; 

     while (!isFinished) 
     { 
      if (!ns.DataAvailable) 
      { 
       Thread.Sleep(200); 

       if ((DateTime.Now - lastConTime).TotalSeconds > Prms.tcpSendReceiveTimeoutInSeconds) 
        break; 
       else 
        continue; 
      } 

      Int32 receiveCount = ns.Read(receiveBuffer, 0, receiveBuffer.Length); 
      String received = new ASCIIEncoding().GetString(receiveBuffer, 0, receiveCount); 

      sbReadBuffer.Append(received); 

      foreach (String terminaterToken in terminaterTokens) 
       if (sbReadBuffer.ToString().EndsWith(terminaterToken)) 
        isFinished = true; 

      lastConTime = DateTime.Now; 
     } 

     return sbReadBuffer.ToString(); 
    } 
} 

et pour la construction de connexion tcp et appeler fonction de réception:

 TcpClient tcpClient = new TcpClient() 
    { 
     SendTimeout = 10000, 
     ReceiveTimeout = 10000 
    }; 

    tcpClient.Connect(wanIp, 23); 
    String initialMessage = receive(); 

J'ai testé les messages reçus pour les périphériques qui code ci-dessus fonctionne sans problème et J'ai réalisé pour chaque modèle de périphérique différent la réponse initiale est toujours quelque chose comme "??% ?????? '????" mais il a suivi par des réponses logiques comme "bienvenue" contre

Pendant mes tests j'ai découvert que le programme se connecte au serveur/à l'appareil avec succès mais ne peut pas recevoir des réponses valides, dont je ne sais pas pourquoi. Une idée à ce sujet?

Répondre

1

Les problèmes entraînant "??% ??" Les symboles sont à cause de l'option Telnet IAC. De retour des valeurs de réponse comme IAC a un plus grand codes décimaux que 255. Pour plus d'informations sur les IAC peut être atteint à l'adresse

support.microsoft.com/kb/231866

Le problème avec les valeurs IAC est que lorsque vous essayez de analyser les réponses avec C# TcpClient en utilisant le code standart

  byte[] sendBuffer = new ASCIIEncoding().GetBytes(str + strNewLine); 
      tcpClient.GetStream().Write(sendBuffer, 0, sendBuffer.Length); 

le code produit ci-dessus "??%" valeurs lorsqu'un valeurs IAC reçues.

Pour éviter cela et gérer les valeurs IAC, j'ai fait quelques recherches et trouvé un excellent projet telnet sur l'adresse http://www.codeproject.com/KB/IP/TelnetSocket.aspx qui gère parfaitement les valeurs IAC.

Pour une meilleure compréhension de la gestion des valeurs IAC, la vérification du code source MinimalisticTelnet sera utile. J'ai pu obtenir des réponses sans problème en utilisant MinimalisticTelnet mais il a échoué lors de l'envoi de messages pour les périphériques sur lesquels je travaille, donc j'ai préféré le projet de socket telnet. Mais je suggère fortement d'étudier le code source MinimalisticTelnet pour une meilleure compréhension.