2010-08-18 5 views
1

Ce ne fonctionne pas pour moi quand je me connecte à ma boîte solarisVB.NET écrire un client telnet en utilisant system.net.tcpclient

Le serveur renvoit

??%

personne ne sait ce que je fais mal

Imports System.Net 
    Imports System.Net.Sockets 
    Imports System.Text 

    Public Class TelnetClient 

     Private _hostname As String = "myserver" 
     Private _username As String = "user" 
     Private _password As String = "pass" 

     Private _port As Integer = 23 
     Private _client As TcpClient 
     Private _data As String 

     Private _sendbuffer(128) As Byte 
     Private _readbuffer(128) As Byte 
     Private _bytecount As Integer 

     Private _stream As NetworkStream 

     Private Sub Send(ByVal Text As String) 
      _sendbuffer = Encoding.ASCII.GetBytes(Text) 
      _stream.Write(_sendbuffer, 0, _sendbuffer.Length) 
     End Sub 

     Private Sub Read() 
      _bytecount = _stream.Read(_readbuffer, 0, _readbuffer.Length) 
      _data = Encoding.ASCII.GetString(_readbuffer) 
     End Sub 

     Public Sub Connect() 

      _client = New TcpClient(_hostname, _port) 

      _stream = _client.GetStream 

      Send(_username) 
      Read() 

      MsgBox(_data) 

      Send(_password) 
      Read() 

      _stream.Close() 

      _client.Close() 





     End Sub 

    End Class 

Répondre

1

Le% que vous obtenez du serveur fait partie de la négociation d'options Telnet. Vous devez effectuer la négociation des options avant toute autre communication.

+0

PeanutPower, consultez http://en.wikipedia.org/wiki/Telnet pour les liens vers les RFC qui définissent le protocole Telnet. –

0

la méthode Read() dans le code ci-dessus i s décoder tout le _readbuffer quand _stream.Read() ne peut remplir qu'une partie du buffer. _bytecount vous dira combien d'octets vous pouvez décoder. Puis-je suggérer d'utiliser StreamReader. La méthode StreamReader.ReadLine() se bloque jusqu'à ce qu'un retour à la ligne soit reçu et vous renvoie une chaîne.

+0

Je ne sais pas si c'est le problème que j'ai essayé d'utiliser interroger et lire ce qui est disponible sur une minuterie, mais cela donne la même réponse du serveur. Y a-t-il un protocole qui me manque? – PeanutPower

0

Vous les obtenez parce que vous essayez de traduire des données brutes avant leur collecte. Vous devez ajouter environ deux secondes de sommeil entre les communications entre les fonctions Telnet.

Public Sub Connect() 

     _client = New TcpClient(_hostname, _port) 

     _stream = _client.GetStream 

     Threading.Thread.Sleep(2000) 

     Send(_username) 
     Threading.Thread.Sleep(2000) 
     Read() 

     MsgBox(_data) 

     Send(_password) 
     Threading.Thread.Sleep(2000) 
     Read() 

     _stream.Close() 

     _client.Close() 
Questions connexes