Hi,
bekomme jedesmal nen error, wenn ich auf mein Netduino+ connecten möchte (über telnet).
Ich hoffe, das ihr mir helfen könnt, da ich nicht schlauer werde. Das Programm schafft es sogar, den Netduino+ server zu crashen -.-
Spoiler anzeigen
Der Fehler tritt immer bei TelnetInterface.vb>"
"
Der fehler: Verbindung fehlgeschlagen : kein login-prompt
Obwohl der Server "Username:" sendet
Wenn ich den TimeOut im Module1.vb erhöhe, bekomme ich in module1.vb>zeile20 den fehler: Verbindung fehlgeschlagen
Obwohl die Konsole schon "Username:" anzeigt...
oder gibt es eine einfachere variante, telnet-befehle zu versenden?
mfg
gfc
bekomme jedesmal nen error, wenn ich auf mein Netduino+ connecten möchte (über telnet).
Ich hoffe, das ihr mir helfen könnt, da ich nicht schlauer werde. Das Programm schafft es sogar, den Netduino+ server zu crashen -.-
Module1.vb
TelnetInterface.vb
VB.NET-Quellcode
- Namespace MinimalisticTelnet
- Module Module1
- Sub Main()
- Console.WriteLine("Ziel-Adresse:")
- 'verlangt die Ziel-Adresse
- Dim x As String = Console.ReadLine()
- 'erstellt eine neue telnet verbindung zum hostname "x" auf dem port 23
- Dim tc As New TelnetConnection(x, 23)
- 'loggt sich mit ein [Username, Passwort, timeout] und wartet den timeout ab.
- Dim s As String = tc.Login("test", "test", 100)
- 'die rückmeldung wird angezeigt
- Console.WriteLine(s)
- 'rückmeldung muss mit einem "$" oder > enden, sonst gilt die verbindung als gescheitert
- Dim prompt As String = s.TrimEnd()
- prompt = s.Substring(prompt.Length - 1, 1)
- If prompt <> "$" AndAlso prompt <> ">" Then
- Throw New Exception("Verbindung fehlgeschlagen")
- End If
- prompt = ""
- 'während die verbindung steht...
- While tc.IsConnected AndAlso prompt.Trim() <> "exit"
- 'zeigt die server-rückmeldungen an
- Console.Write(tc.Read())
- 'sendet dem Server den eingegebenen befehl
- prompt = Console.ReadLine()
- tc.WriteLine(prompt)
- 'zeigt die server-rückmeldungen an
- Console.Write(tc.Read())
- End While
- ' und wenn die verbindung getrennt wird, wird eine nachricht ausgegeben
- Console.WriteLine("***VERBINDUNG GETRENNT")
- Console.ReadLine()
- End Sub
- End Module
- End Namespace
TelnetInterface.vb
VB.NET-Quellcode
- Imports System.Collections.Generic
- Imports System.Text
- Imports System.Net.Sockets
- Namespace MinimalisticTelnet
- Enum Verbs
- WILL = 251
- WONT = 252
- [DO] = 253
- DONT = 254
- IAC = 255
- End Enum
- Enum Options
- SGA = 3
- End Enum
- Class TelnetConnection
- Private tcpSocket As TcpClient
- 'Definiert den "Timeout"
- Private TimeOutMs As Integer = 500
- Public Sub New(ByVal Hostname As String, ByVal Port As Integer)
- 'Startet einen tcpclient mit dem hostname und dem Port
- tcpSocket = New TcpClient(Hostname, Port)
- End Sub
- Public Function Login(ByVal Username As String, ByVal Password As String, ByVal LoginTimeOutMs As Integer) As String
- 'Klasse, um sich einzuloggen
- 'Wenn kein username: oder Passwort: verlangt wird, wird die verbindung als fehlgeschalgen erklärt
- 'speichert den internen timeout temporät ab...
- Dim oldTimeOutMs As Integer = TimeOutMs
- 'und ändert ihn mit dem eingegebenen timeout um.
- TimeOutMs = LoginTimeOutMs
- Dim s As String = Read()
- 'Wenn kein Username verlangt wird, wird die verbindung getrennt
- If Not s.TrimEnd().EndsWith(":") Then
- Throw New Exception("Verbindung fehlgeschlagen : kein login-prompt")
- End If
- WriteLine(Username)
- 'Wenn kein Passwort verlangt wird, wird die verbindung getrennt
- s += Read()
- If Not s.TrimEnd().EndsWith(":") Then
- Throw New Exception("Verbindung fehlgeschlagen : kein passwort-prompt")
- End If
- WriteLine(Password)
- 'Wenn die verbindung akzeptiert wird, wird die Rückmeldung zurückgegeben.
- s += Read()
- 'Der interne Timeout wird wiederhergestellt.
- TimeOutMs = oldTimeOutMs
- 'Gibt den jeweiligen Wert (oder fehler) zurück
- Return s
- End Function
- Public Sub WriteLine(ByVal cmd As String)
- 'Hier werden die Befehle gesendet
- Write(cmd & vbLf)
- End Sub
- Public Sub Write(ByVal cmd As String)
- If Not tcpSocket.Connected Then
- Return
- End If
- Dim buf As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace(vbNullChar & "xFF", vbNullChar & "xFF" & vbNullChar & "xFF"))
- tcpSocket.GetStream().Write(buf, 0, buf.Length)
- End Sub
- Public Function Read() As String
- If Not tcpSocket.Connected Then
- Return Nothing
- End If
- Dim sb As New StringBuilder()
- Do
- ParseTelnet(sb)
- System.Threading.Thread.Sleep(TimeOutMs)
- Loop While tcpSocket.Available > 0
- Return sb.ToString()
- End Function
- Public ReadOnly Property IsConnected() As Boolean
- Get
- Return tcpSocket.Connected
- End Get
- End Property
- Private Sub ParseTelnet(ByVal sb As StringBuilder)
- While tcpSocket.Available > 0
- Dim input As Integer = tcpSocket.GetStream().ReadByte()
- Select Case input
- Case -1
- Exit Select
- Case CInt(Verbs.IAC)
- ' interpret as command
- Dim inputverb As Integer = tcpSocket.GetStream().ReadByte()
- If inputverb = -1 Then
- Exit Select
- End If
- Select Case inputverb
- Case CInt(Verbs.IAC)
- 'literal IAC = 255 escaped, so append char 255 to string
- sb.Append(inputverb)
- Exit Select
- Case CInt(Verbs.[DO]), CInt(Verbs.DONT), CInt(Verbs.WILL), CInt(Verbs.WONT)
- ' reply to all commands with "WONT", unless it is SGA (suppres go ahead)
- Dim inputoption As Integer = tcpSocket.GetStream().ReadByte()
- If inputoption = -1 Then
- Exit Select
- End If
- tcpSocket.GetStream().WriteByte(CByte(Verbs.IAC))
- If inputoption = CInt(Options.SGA) Then
- tcpSocket.GetStream().WriteByte(If(inputverb = CInt(Verbs.[DO]), CByte(Verbs.WILL), CByte(Verbs.[DO])))
- Else
- tcpSocket.GetStream().WriteByte(If(inputverb = CInt(Verbs.[DO]), CByte(Verbs.WONT), CByte(Verbs.DONT)))
- End If
- tcpSocket.GetStream().WriteByte(CByte(inputoption))
- Exit Select
- Case Else
- Exit Select
- End Select
- Exit Select
- Case Else
- sb.Append(ChrW(input))
- Exit Select
- End Select
- End While
- End Sub
- End Class
- End Namespace
Der Fehler tritt immer bei TelnetInterface.vb>"
Der fehler: Verbindung fehlgeschlagen : kein login-prompt
Obwohl der Server "Username:" sendet
Wenn ich den TimeOut im Module1.vb erhöhe, bekomme ich in module1.vb>zeile20 den fehler: Verbindung fehlgeschlagen
Obwohl die Konsole schon "Username:" anzeigt...
oder gibt es eine einfachere variante, telnet-befehle zu versenden?
mfg
gfc
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „gfcwfzkm“ ()