📄 telnet.frm
字号:
Receiving = True
term_CaretControl True
Else
Exit Sub
End If
If (bytesTotal > 0) Then ' If there is any data...
WinsockClient.GetData CH, vbByte + vbArray, bytesTotal
' CH = Buf
For I = 0 To bytesTotal - 1
Select Case cmd
Case GO_NORM
cmd = term_process_char(CH(I))
Case GO_IAC1
cmd = iac1(CH(I))
Case GO_IAC2
cmd = iac2(CH(I))
Case GO_IAC3
cmd = iac3(CH(I))
Case GO_IAC4
cmd = iac4(CH(I))
Case GO_IAC5
cmd = iac5(CH(I))
Case GO_IAC6
cmd = iac6(CH(I))
Case Else
If TraceTelnet Then Debug.Print "Invalid 'next (" + Str$(cmd) + ")' processing routine in cmd loop"
End Select
Next I
End If
term_CaretControl False
Receiving = False
End Sub
Private Function iac1(CH As Byte) As Integer
' Debug.Print "IAC : ";
iac1 = GO_NORM
Select Case CH
Case DOTEL
iac1 = GO_IAC2
Case DONTTEL
iac1 = GO_IAC6
Case WILLTEL
iac1 = GO_IAC3
Case WONTTEL
iac1 = GO_IAC4
Case SB
iac1 = GO_IAC5
ppno = 0
Case SE
' End of negotiation string, string is in parsedata()
Select Case parsedata(0)
Case TERMTYPE
If parsedata(1) = 1 Then
If TraceTelnet Then Debug.Print "SENT: SB TERMTYPE VT100"
WinsockClient.SendData Chr$(IAC) & Chr$(SB) & Chr$(TERMTYPE) & "DEC-VT100" & Chr$(0) & Chr$(IAC) & Chr$(SE)
End If
Case TERMSPEED
If parsedata(1) = 1 Then
' Debug.Print "TERMSPEED"
If TraceTelnet Then Debug.Print "SENT: SB TERMSPEED 38400"
WinsockClient.SendData Chr$(IAC) & Chr$(WILLTEL) & Chr$(CH)
WinsockClient.SendData Chr$(IAC) & Chr$(SB) _
& Chr$(TERMSPEED) & Chr$(0) _
& "57600,57600" _
& Chr$(IAC) & Chr$(SE)
End If
End Select
End Select
End Function
Private Function iac2(CH As Byte) As Integer
'DO Processing Respond with WILL or WONT
If TraceTelnet Then Debug.Print " RECEIVED DO : ";
iac2 = GO_NORM
Select Case CH
Case BINARY
If TraceTelnet Then Debug.Print "BINARY"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(BINARY)
If TraceTelnet Then Debug.Print "SENT: WONT BINARY"
Case ECHO
If TraceTelnet Then Debug.Print "ECHO"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(ECHO)
If TraceTelnet Then Debug.Print "SENT: WONT ECHO"
Case NAWS
If TraceTelnet Then Debug.Print "WINDOW SIZE"
WinsockClient.SendData Chr$(IAC) & Chr$(SB) & Chr$(NAWS) & Chr$(0) & Chr$(80) & Chr$(0) & Chr$(24) & Chr$(IAC) & Chr$(SE)
If TraceTelnet Then Debug.Print "SENT: SB WINDOW SIZE 80x24"
Case SGA
If TraceTelnet Then Debug.Print "SGA"
If Not sw_igoahead Then
If TraceTelnet Then Debug.Print "SENT: WILL SGA"
WinsockClient.SendData Chr$(IAC) & Chr$(WILLTEL) & Chr$(SGA)
sw_igoahead = True
Else
If TraceTelnet Then Debug.Print "DID NOT RESPOND"
End If
Case TERMTYPE
If TraceTelnet Then Debug.Print "TERMTYPE"
If Not sw_termsent Then
If TraceTelnet Then Debug.Print "SENT: WILL TERMTYPE"
sw_termsent = True
WinsockClient.SendData Chr$(IAC) & Chr$(WILLTEL) & Chr$(TERMTYPE)
If TraceTelnet Then Debug.Print "SENT: SB TERMTYPE VT100"
WinsockClient.SendData Chr$(IAC) & Chr$(SB) & Chr$(TERMTYPE) & _
Chr$(0) & "VT100" & Chr$(IAC) & Chr$(SE)
Else
If TraceTelnet Then Debug.Print "DID NOT RESPOND"
End If
Case TERMSPEED
If TraceTelnet Then Debug.Print "TERMSPEED"
If TraceTelnet Then Debug.Print "SENT: WILL TERMSPEED"
WinsockClient.SendData Chr$(IAC) & Chr$(WILLTEL) & Chr$(TERMSPEED)
If TraceTelnet Then Debug.Print "SENT: SB TERMSPEED 57600"
WinsockClient.SendData Chr$(IAC) & Chr$(SB) & Chr$(TERMSPEED) & Chr$(0)
WinsockClient.SendData "57600,57600"
WinsockClient.SendData Chr$(IAC) & Chr$(SE)
Case TFLOWCNTRL
If TraceTelnet Then Debug.Print "TFLOWCNTRL"
If TraceTelnet Then Debug.Print "SENT: WONT FLOWCONTROL"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case LINEMODE
If TraceTelnet Then Debug.Print "LINEMODE"
If TraceTelnet Then Debug.Print "SENT: WONT LINEMODE"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case STATUS
If TraceTelnet Then Debug.Print "STATUS"
If TraceTelnet Then Debug.Print "SENT: WONT STATUS"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case TIMING
If TraceTelnet Then Debug.Print "TIMING"
If TraceTelnet Then Debug.Print "SENT: WONT TIMING"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case DISPLOC
If TraceTelnet Then Debug.Print "DISPLOC"
If TraceTelnet Then Debug.Print "SENT: WONT DISPLOC"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case ENVIRON
If TraceTelnet Then Debug.Print "ENVIRON"
If TraceTelnet Then Debug.Print "SENT: WONT ENVIRON"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case UNKNOWN39
If TraceTelnet Then Debug.Print "UNKNOWN39"
If TraceTelnet Then Debug.Print "SENT: WONT " & Asc(CH)
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case AUTHENTICATION
If TraceTelnet Then Debug.Print "AUTHENTICATION"
If TraceTelnet Then Debug.Print "SENT: WILL "; AUTHENTICATION; ""
WinsockClient.SendData Chr$(IAC) & Chr$(WILLTEL) & Chr$(CH)
If TraceTelnet Then Debug.Print "SENT: SB AUTHENTICATION"
WinsockClient.SendData Chr$(IAC) & _
Chr$(SB) & _
Chr$(AUTHENTICATION) & _
Chr$(0) & Chr$(0) & Chr$(0) & Chr$(0) & _
Chr$(IAC) & _
Chr$(SE)
Case Else
If TraceTelnet Then Debug.Print "UNKNOWN CMD " & Asc(CH)
If TraceTelnet Then Debug.Print "SENT: WONT UNKNOWN CMD " & CH
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
End Select
End Function
Private Function iac3(CH As Byte) As Integer
' WILL Processing - Respond with DO or DONT
If TraceTelnet Then Debug.Print " RECEIVED WILL : ";
iac3 = GO_NORM
Select Case CH
Case ECHO
If TraceTelnet Then Debug.Print "ECHO"
If Not sw_echo Then
sw_echo = True
WinsockClient.SendData Chr$(IAC) & Chr$(DOTEL) & Chr$(ECHO)
If TraceTelnet Then Debug.Print "SENT: DO ECHO"
End If
Case SGA
If TraceTelnet Then Debug.Print "SGA"
If Not sw_ugoahead Then
sw_ugoahead = True
WinsockClient.SendData Chr$(IAC) & Chr$(DOTEL) & Chr$(SGA)
If TraceTelnet Then Debug.Print "SENT: DOTEL SGA"
End If
Case TERMSPEED
If TraceTelnet Then Debug.Print "TERMSPEED"
If TraceTelnet Then Debug.Print "SENT: DONT TERMSPEED"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case TFLOWCNTRL
If TraceTelnet Then Debug.Print "TFLOWCNTRL"
If TraceTelnet Then Debug.Print "SENT: DONT FLOWCONTROL"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case LINEMODE
If TraceTelnet Then Debug.Print "LINEMODE"
If TraceTelnet Then Debug.Print "SENT: DONT LINEMODE"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case STATUS
If TraceTelnet Then Debug.Print "STATUS"
If TraceTelnet Then Debug.Print "SENT: DONT STATUS"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case TIMING
If TraceTelnet Then Debug.Print "TIMING"
If TraceTelnet Then Debug.Print "SENT: DONT TIMING"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case DISPLOC
If TraceTelnet Then Debug.Print "DISPLOC"
If TraceTelnet Then Debug.Print "SENT: WONT DISPLOC"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case ENVIRON
If TraceTelnet Then Debug.Print "ENVIRON"
If TraceTelnet Then Debug.Print "SENT: WONT ENVIRON"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case UNKNOWN39
If TraceTelnet Then Debug.Print "UNKNOWN39"
If TraceTelnet Then Debug.Print "SENT: WONT " & Asc(CH)
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case Else
If TraceTelnet Then Debug.Print "UNKNOWN CMD " & Asc(CH)
If TraceTelnet Then Debug.Print "SENT: WONT UNKNOWN CMD " & Asc(CH)
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
End Select
End Function
Private Function iac4(CH As Byte) As Integer
' WONT Processing
If TraceTelnet Then Debug.Print " RECEIVED WONT : ";
iac4 = GO_NORM
Select Case CH
Case ECHO
If TraceTelnet Then Debug.Print "ECHO"
If sw_echo = True Then
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(ECHO)
If TraceTelnet Then Debug.Print "SENT: DONTEL ECHO"
sw_echo = False
End If
Case SGA
If TraceTelnet Then Debug.Print "SGA"
If TraceTelnet Then Debug.Print "SENT: DONT SGA"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(SGA)
sw_igoahead = False
Case TERMSPEED
If TraceTelnet Then Debug.Print "TERMSPEED"
If TraceTelnet Then Debug.Print "SENT: DONT TERMSPEED"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case TFLOWCNTRL
If TraceTelnet Then Debug.Print "FLOWCONTROL"
If TraceTelnet Then Debug.Print "SENT: DONT FLOWCONTROL"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case LINEMODE
If TraceTelnet Then Debug.Print "LINEMODE"
If TraceTelnet Then Debug.Print "SENT: DONT LINEMODE"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case STATUS
If TraceTelnet Then Debug.Print "STATUS"
If TraceTelnet Then Debug.Print "SENT: DONT STATUS"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case TIMING
If TraceTelnet Then Debug.Print "TIMING"
If TraceTelnet Then Debug.Print "SENT: DONT TIMING"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case DISPLOC
If TraceTelnet Then Debug.Print "DISPLOC"
If TraceTelnet Then Debug.Print "SENT: DONT DISPLOC"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case ENVIRON
If TraceTelnet Then Debug.Print "ENVIRON"
If TraceTelnet Then Debug.Print "SENT: DONT ENVIRON"
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case UNKNOWN39
If TraceTelnet Then Debug.Print "UNKNOWN39"
If TraceTelnet Then Debug.Print "SENT: DONT " & Asc(CH)
WinsockClient.SendData Chr$(IAC) & Chr$(DONTTEL) & Chr$(CH)
Case Else
If TraceTelnet Then Debug.Print "UNKNOWN CMD " & Asc(CH)
If TraceTelnet Then Debug.Print "SENT: DONT UNKNOWN CMD " & Asc(CH)
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
End Select
End Function
Private Function iac5(CH As Byte) As Integer
Dim ich As Integer
' Collect parms after SB and until another IAC
ich = CH
If ich = IAC Then
iac5 = GO_IAC1
Exit Function
End If
If TraceTelnet Then Debug.Print " RECEIVED : ";
If TraceTelnet Then Debug.Print "SB("; ppno; ") = " & ich
parsedata(ppno) = ich
ppno = ppno + 1
iac5 = GO_IAC5
End Function
Private Function iac6(CH As Byte) As Integer
'DONT Processing
iac6 = GO_NORM
Select Case CH
Case SE
If TraceTelnet Then Debug.Print " RECEIVED SE"
If TraceTelnet Then Debug.Print "SENT: SE_ACK " & CH
Case ECHO
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "ECHO"
If Not sw_echo Then
sw_echo = True
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(ECHO)
If TraceTelnet Then Debug.Print "SENT: WONT ECHO"
End If
Case SGA
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "SGA"
If Not sw_ugoahead Then
sw_ugoahead = True
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(SGA)
If TraceTelnet Then Debug.Print "SENT: WONT SGA"
End If
Case TERMSPEED
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "TERMSPEED"
If TraceTelnet Then Debug.Print "SENT: WONT TERMSPEED"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case TFLOWCNTRL
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "TFLOWCNTRL"
If TraceTelnet Then Debug.Print "SENT: WONT FLOWCONTROL"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case LINEMODE
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "LINEMODE"
If TraceTelnet Then Debug.Print "SENT: WONT LINEMODE"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case STATUS
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "STATUS"
If TraceTelnet Then Debug.Print "SENT: WONT STATUS"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case TIMING
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "TIMING"
If TraceTelnet Then Debug.Print "SENT: WONT TIMING"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case DISPLOC
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "DISPLOC"
If TraceTelnet Then Debug.Print "SENT: WONT DISPLOC"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case ENVIRON
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "ENVIRON"
If TraceTelnet Then Debug.Print "SENT: WONT ENVIRON"
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case UNKNOWN39
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "UNKNOWN39"
If TraceTelnet Then Debug.Print "SENT: WONT " & Asc(CH)
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
Case Else
If TraceTelnet Then Debug.Print " RECEIVED DONT : ";
If TraceTelnet Then Debug.Print "UNKNOWN CMD " & Asc(CH)
If TraceTelnet Then Debug.Print "SENT: WONT UNKNOWN CMD " & Asc(CH)
WinsockClient.SendData Chr$(IAC) & Chr$(WONTTEL) & Chr$(CH)
End Select
End Function
Private Sub WinsockClient_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
frmTelnet.stbStatusBar.Panels(4).Text = Number & " - " & Description
Operating = False
Connected = False
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -