VB.NET writing a telnet client using system.net.tcpclient

17,728

Solution 1

The ??% that you are getting from the server is part of the Telnet options negotiation. You need to do the options negotiation before any other communication can take place.

Solution 2

The Read() method in the code above is decoding the entire _readbuffer when _stream.Read() may only fill part of the buffer. _bytecount will tell you how many bytes you can decode.

Can I suggest using a StreamReader. The StreamReader.ReadLine() method will block until a newline is received and give you a string back.

Solution 3

You're getting those because you're trying to translate raw data before its collected. You need to add in a about a 2 second sleep between communication between telnet functions.

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()
Share:
17,728
acheo
Author by

acheo

My stack overfloweth

Updated on June 25, 2022

Comments

  • acheo
    acheo almost 2 years

    This isn't working for me when I connect to my solaris box

    The server is sending back

    ??%

    does anyone know what i'm doing wrong

    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
    
  • acheo
    acheo over 13 years
    Not sure if this is the issue as I tried using poll and read whats available on a timer but this gives the same response from the server. Is there some protocol i'm missing?
  • Brian Low
    Brian Low over 13 years
    PeanutPower, check out en.wikipedia.org/wiki/Telnet for links to RFCs that define the Telnet protocol.