Telnet Client - Verbindung schlägt fehl, error

  • VB.NET

    Telnet Client - Verbindung schlägt fehl, error

    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
    Module1.vb

    VB.NET-Quellcode

    1. Namespace MinimalisticTelnet
    2. Module Module1
    3. Sub Main()
    4. Console.WriteLine("Ziel-Adresse:")
    5. 'verlangt die Ziel-Adresse
    6. Dim x As String = Console.ReadLine()
    7. 'erstellt eine neue telnet verbindung zum hostname "x" auf dem port 23
    8. Dim tc As New TelnetConnection(x, 23)
    9. 'loggt sich mit ein [Username, Passwort, timeout] und wartet den timeout ab.
    10. Dim s As String = tc.Login("test", "test", 100)
    11. 'die rückmeldung wird angezeigt
    12. Console.WriteLine(s)
    13. 'rückmeldung muss mit einem "$" oder > enden, sonst gilt die verbindung als gescheitert
    14. Dim prompt As String = s.TrimEnd()
    15. prompt = s.Substring(prompt.Length - 1, 1)
    16. If prompt <> "$" AndAlso prompt <> ">" Then
    17. Throw New Exception("Verbindung fehlgeschlagen")
    18. End If
    19. prompt = ""
    20. 'während die verbindung steht...
    21. While tc.IsConnected AndAlso prompt.Trim() <> "exit"
    22. 'zeigt die server-rückmeldungen an
    23. Console.Write(tc.Read())
    24. 'sendet dem Server den eingegebenen befehl
    25. prompt = Console.ReadLine()
    26. tc.WriteLine(prompt)
    27. 'zeigt die server-rückmeldungen an
    28. Console.Write(tc.Read())
    29. End While
    30. ' und wenn die verbindung getrennt wird, wird eine nachricht ausgegeben
    31. Console.WriteLine("***VERBINDUNG GETRENNT")
    32. Console.ReadLine()
    33. End Sub
    34. End Module
    35. End Namespace



    TelnetInterface.vb

    VB.NET-Quellcode

    1. Imports System.Collections.Generic
    2. Imports System.Text
    3. Imports System.Net.Sockets
    4. Namespace MinimalisticTelnet
    5. Enum Verbs
    6. WILL = 251
    7. WONT = 252
    8. [DO] = 253
    9. DONT = 254
    10. IAC = 255
    11. End Enum
    12. Enum Options
    13. SGA = 3
    14. End Enum
    15. Class TelnetConnection
    16. Private tcpSocket As TcpClient
    17. 'Definiert den "Timeout"
    18. Private TimeOutMs As Integer = 500
    19. Public Sub New(ByVal Hostname As String, ByVal Port As Integer)
    20. 'Startet einen tcpclient mit dem hostname und dem Port
    21. tcpSocket = New TcpClient(Hostname, Port)
    22. End Sub
    23. Public Function Login(ByVal Username As String, ByVal Password As String, ByVal LoginTimeOutMs As Integer) As String
    24. 'Klasse, um sich einzuloggen
    25. 'Wenn kein username: oder Passwort: verlangt wird, wird die verbindung als fehlgeschalgen erklärt
    26. 'speichert den internen timeout temporät ab...
    27. Dim oldTimeOutMs As Integer = TimeOutMs
    28. 'und ändert ihn mit dem eingegebenen timeout um.
    29. TimeOutMs = LoginTimeOutMs
    30. Dim s As String = Read()
    31. 'Wenn kein Username verlangt wird, wird die verbindung getrennt
    32. If Not s.TrimEnd().EndsWith(":") Then
    33. Throw New Exception("Verbindung fehlgeschlagen : kein login-prompt")
    34. End If
    35. WriteLine(Username)
    36. 'Wenn kein Passwort verlangt wird, wird die verbindung getrennt
    37. s += Read()
    38. If Not s.TrimEnd().EndsWith(":") Then
    39. Throw New Exception("Verbindung fehlgeschlagen : kein passwort-prompt")
    40. End If
    41. WriteLine(Password)
    42. 'Wenn die verbindung akzeptiert wird, wird die Rückmeldung zurückgegeben.
    43. s += Read()
    44. 'Der interne Timeout wird wiederhergestellt.
    45. TimeOutMs = oldTimeOutMs
    46. 'Gibt den jeweiligen Wert (oder fehler) zurück
    47. Return s
    48. End Function
    49. Public Sub WriteLine(ByVal cmd As String)
    50. 'Hier werden die Befehle gesendet
    51. Write(cmd & vbLf)
    52. End Sub
    53. Public Sub Write(ByVal cmd As String)
    54. If Not tcpSocket.Connected Then
    55. Return
    56. End If
    57. Dim buf As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace(vbNullChar & "xFF", vbNullChar & "xFF" & vbNullChar & "xFF"))
    58. tcpSocket.GetStream().Write(buf, 0, buf.Length)
    59. End Sub
    60. Public Function Read() As String
    61. If Not tcpSocket.Connected Then
    62. Return Nothing
    63. End If
    64. Dim sb As New StringBuilder()
    65. Do
    66. ParseTelnet(sb)
    67. System.Threading.Thread.Sleep(TimeOutMs)
    68. Loop While tcpSocket.Available > 0
    69. Return sb.ToString()
    70. End Function
    71. Public ReadOnly Property IsConnected() As Boolean
    72. Get
    73. Return tcpSocket.Connected
    74. End Get
    75. End Property
    76. Private Sub ParseTelnet(ByVal sb As StringBuilder)
    77. While tcpSocket.Available > 0
    78. Dim input As Integer = tcpSocket.GetStream().ReadByte()
    79. Select Case input
    80. Case -1
    81. Exit Select
    82. Case CInt(Verbs.IAC)
    83. ' interpret as command
    84. Dim inputverb As Integer = tcpSocket.GetStream().ReadByte()
    85. If inputverb = -1 Then
    86. Exit Select
    87. End If
    88. Select Case inputverb
    89. Case CInt(Verbs.IAC)
    90. 'literal IAC = 255 escaped, so append char 255 to string
    91. sb.Append(inputverb)
    92. Exit Select
    93. Case CInt(Verbs.[DO]), CInt(Verbs.DONT), CInt(Verbs.WILL), CInt(Verbs.WONT)
    94. ' reply to all commands with "WONT", unless it is SGA (suppres go ahead)
    95. Dim inputoption As Integer = tcpSocket.GetStream().ReadByte()
    96. If inputoption = -1 Then
    97. Exit Select
    98. End If
    99. tcpSocket.GetStream().WriteByte(CByte(Verbs.IAC))
    100. If inputoption = CInt(Options.SGA) Then
    101. tcpSocket.GetStream().WriteByte(If(inputverb = CInt(Verbs.[DO]), CByte(Verbs.WILL), CByte(Verbs.[DO])))
    102. Else
    103. tcpSocket.GetStream().WriteByte(If(inputverb = CInt(Verbs.[DO]), CByte(Verbs.WONT), CByte(Verbs.DONT)))
    104. End If
    105. tcpSocket.GetStream().WriteByte(CByte(inputoption))
    106. Exit Select
    107. Case Else
    108. Exit Select
    109. End Select
    110. Exit Select
    111. Case Else
    112. sb.Append(ChrW(input))
    113. Exit Select
    114. End Select
    115. End While
    116. End Sub
    117. End Class
    118. End Namespace



    Der Fehler tritt immer bei TelnetInterface.vb>"

    VB.NET-Quellcode

    1. If Not s.TrimEnd().EndsWith(":") Then
    2. Throw New Exception("Verbindung fehlgeschlagen : kein login-prompt")
    3. End If
    "

    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“ ()