VB.NET writing a telnet client using system.net.tcpclient
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()
Comments
-
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 over 13 yearsNot 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 over 13 yearsPeanutPower, check out en.wikipedia.org/wiki/Telnet for links to RFCs that define the Telnet protocol.