【问题标题】:telnet options negotiation issuetelnet 选项协商问题
【发布时间】:2016-07-02 09:18:54
【问题描述】:

我正在尝试编写一个 telnet 客户端,我们可以使用它来自动化我们通常发送到服务器的一堆命令。当我使用它连接到我们的服务器时,我首先得到 Telnet 选项协商命令,然后是欢迎消息,然后是用户名:提示。我发送了正确的 DONT 命令,但服务器只是回显它们并且不响应任何内容。下面是我的代码。希望有人可以理解这一点以及我做错了什么。如果还有什么我可以详细说明的,请告诉我。

Imports System.Text
Imports System.Net.Sockets
Module Module1
    Dim Full_Stop As String = ""
    Dim TelnetClient As New TcpClient
    Sub Main()
        TelnetClient.Connect("telnet.server.com", 23) 'Connecting to the IP Given
        Dim thr As New Threading.Thread(AddressOf Receive_thread) 'define the thread that will handle data received
        thr.Start() ' start the thread
        Dim SendData As String = ""
        While SendData <> "quit" 'loop until we quit the program
            SendData = Console.ReadLine
            If SendData <> "quit" Then
                Send_Sub(SendData) 'send a command
            End If
        End While
        Full_Stop = "Stop" 'kill the thread
        TelnetClient.Close()
    End Sub
    Sub Send_Sub(ByVal msg As String)
        Dim byt_to_send() As Byte = System.Text.Encoding.ASCII.GetBytes(msg)
        TelnetClient.Client.Send(byt_to_send, 0, byt_to_send.Length, SocketFlags.None)
    End Sub
    Sub Receive_thread()
re:
        If Full_Stop = "Stop" Then Exit Sub 'If you set Full_Stop string to "Stop" the thread will end
        If TelnetClient.Client.Available > 0 Then 'Check if there is any Data to receive
            Dim byt_to_receive(TelnetClient.Available - 1) As Byte
            TelnetClient.Client.Receive(byt_to_receive, 0, byt_to_receive.Length, SocketFlags.None) 'receive the data
            For lc = 0 To byt_to_receive.Length - 2 'go through the entire byte array
                If byt_to_receive(lc) = 255 Then 'looking for commands
                    Select Case byt_to_receive(lc + 1)
                        Case 251 'if a WILL command is received
                            Dim byt_to_send() As Byte = {255, 254, lc + 2} 'send a DONT command
                            TelnetClient.Client.Send(byt_to_send, 0, byt_to_send.Length, SocketFlags.None)
                        Case 253 'if a DO command is received
                            Dim byt_to_send() As Byte = {255, 252, lc + 2} 'send a WONT command
                            TelnetClient.Client.Send(byt_to_send, 0, byt_to_send.Length, SocketFlags.None)
                    End Select
                End If
            Next
            Dim String_From_Byte As String = System.Text.Encoding.ASCII.GetString(byt_to_receive)
            Console.Write(String_From_Byte)
        End If
        GoTo re 'this will NOT allow the thread to End by sending it back to re: statement, unless the Full_Stop is "Stop"
    End Sub
End Module

【问题讨论】:

  • 你不能只检查对等端发送的first命令,然后假设接收缓冲区中的所有其余部分也是命令。处理完一个命令后,您需要再次检查IAC。您还必须记住,TCP 是一个 streaming 协议,消息之间没有界限。该流式传输部分还意味着当您从对等方接收时,您可能不会收到您要求的所有数据,因此您收到的数据可能包含 partial 命令。您可能需要在 TCP 连接之上添加另一层缓冲。
  • 帽子虽然用于实际处理 telnet 命令,并发送正确的东西。但是,您应该不要忘记,对等方可以发送DONTWONT作为请求,以及许多其他命令和协商请求。
  • 好的,我在receive_thread() 中更改了我的代码,以查看传入的每个字节并验证是否有任何IAC。我仍然只看到两个命令,即 WILL ECHO 和 WILL SUPPRESS GO AHEAD,我没有发送 DONT ECHO 和 DONT SUPPRESS GO AHEAD。服务器将我的命令回显给我(具有讽刺意味),然后继续回显我键入的任何内容,并且不处理任何内容。无法弄清楚我做错了什么。所有 IAC 都以字节为首:255,对吧?
  • 您可能想阅读RFC 857,这是关于 Telnet echo 的。简而言之,您可以尝试发送IAC WILL ECHO(这个很重要)和IAC DONT ECHO(不太重要)。这应该告诉对等方不要回显,并且您将处理 echoing ,如果您不“回显”,则不应回显您发送的任何内容。
  • 好的,我会继续阅读它,至于我的其余代码,看起来我将命令发送回来好吗?我是否也将我的 DONT/WILL 命令以字节 255 为首发回?

标签: vb.net sockets telnet


【解决方案1】:

已修复!我发送的是 vbnewline 而不是 {10, 13} 作为字节发送。

我不必弄清楚为什么我会得到一堆垃圾,上面有我想要的文字......

【讨论】:

  • 为了获得最佳互操作性,您应该发送 13 后跟 10(即 CR LF),而不是反过来 (LF CR)。
猜你喜欢
  • 2017-02-25
  • 2011-04-06
  • 2018-09-30
  • 1970-01-01
  • 2015-01-17
  • 2014-11-17
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多