2017-03-08 1 views
0

J'essaie de transmettre des données à un serveur Telnet. Je reçois l'invite initiale pour les informations d'identification de connexion, mais il ne prendra pas le nom d'utilisateur. Je dois passer le nom d'utilisateur, attendez une invite de mot de passe et entrez cela. Ensuite, être en mesure d'envoyer et de recevoir des données, en gardant le socket ouvert à tout moment.Telnet n'envoie pas de données

mon code ressemble à ceci (son rugueux que je suis en train dans la console d'abord)

try 
      { 
       client = new TcpClient("10.0.0.94",23); 
       Console.WriteLine("Connected to server."); 
      } 
      catch (SocketException) 
      { 
       Console.WriteLine("Failed to connect to server"); 
       return; 
      } 

      //Assign networkstream 
      NetworkStream networkStream = client.GetStream(); 


      byte[] data = new byte[1024]; 
      int size = networkStream.Read(data, 0, data.Length); 
      recieved = Encoding.ASCII.GetString(data, 0, size); 

      Console.WriteLine(recieved); 


      if (recieved.Contains("login")) 
      { 

       string loginrx; 
       string cmd = string.Format("{0}\r",user) ; 

       byte[] writeBuffer = Encoding.ASCII.GetBytes(cmd); 

       networkStream.Write(writeBuffer, 0, writeBuffer.Length); 

       byte[] logindata = new byte[1024]; 
       int loginsize = networkStream.Read(logindata, 0, logindata.Length); 
       loginrx = Encoding.ASCII.GetString(logindata, 0, loginsize); 

       Console.WriteLine(loginrx); 
       Console.ReadLine(); 

      } 

Je reçois l'invite de connexion, mais tout s'arrête là.

toute aide serait géniale.

+1

ajouter un "networkStream.Flush();" après l'écriture() – sevzas

+0

De quel type de retour avez-vous besoin? \ r ou \ n ou \ r \ n – jdweng

Répondre

0

cela a fonctionné comme un charme

while(Connected == false) 
      { 
       byte[] data = new byte[1024]; 
       int size = networkStream.Read(data, 0, data.Length); 
       recieved = Encoding.ASCII.GetString(data, 0, size); 
       Console.WriteLine(recieved); 

       if (recieved.Contains("login")) 
         { 
          login = string.Format("{0}\r\n",user); 
          Console.WriteLine("user request found:{0}", login); 
         } 
       else if (recieved.Contains("password")) 
       { 
        login = string.Format("{0}\r\n",pass); 
        Console.WriteLine("password request found:{0}", login); 
       } 
       else if (recieved.Contains("GNET")) 
       { 
        Console.WriteLine(recieved); 
        Connected = true; 
       } 

       byte[] loginBuffer = Encoding.ASCII.GetBytes(login); 

       networkStream.Write(loginBuffer, 0, loginBuffer.Length); 
       networkStream.Flush(); 


      } 
0

Un envoi n'est pas égal une fois reçu. Vous avez besoin d'un moyen de dire que vous êtes à la "fin d'un message" (probablement un saut de ligne). Voir Message Framing pour certains matériels d'apprentissage.

Vous aurez besoin de consulter le protocole Telnet, mais vous aurez probablement besoin de continuer à lire jusqu'à ce que vous lisiez dans une nouvelle ligne avant de vérifier le texte que vous avez. Vous pouvez utiliser un var sr = new StreamReader(networkStream, Encoding.ASCII) avec sr.ReadLine() pour lire dans vos chaînes au lieu d'appeler manuellement networkStream.Read et d'utiliser Encoding.ASCII.GetString pour décoder.

+0

Question qui semble implémenter cette suggestion .: http://stackoverflow.com/questions/3508936/vb-net-writing-a-telnet-client-using-system-net- tcpclient – sevzas