标签: 杂谈 |
本来以为telnet很简单,客户端把登录帐号和命令发过去,对端返回结果就行了。其实在telnet过程中,双方还会互相发送一些命令,这些命令有些大概的作用是通知、协商或者控制。
一、TELNET协议简介
1、参考
telnet的命令格式大概是这样,分3个或4个字段,每个字段一个字节。
前导 命令 选项 [子选项 ]
下面是详细资料:
(1)前导
255:IAC,表示其后的数据为命令和选项
(2)命令
236:EOF 文件结束符
237:SUSP 挂起当前进程(作业控制)
238:ABORT 异常中止进程
239:EOR 记录结束符
240:SE 子选项结束
241:NOP 无操作
242:DM (Data Mark) 数据标记
243:BRK (Break)中断
244:IP (Interrupt Process)中断进程
245:AO (Abort Output)异常中止输出
246:AYT (Are You There)对方是否还在运行
247:EC (Erase Character)
248:EL (Erase Line)删除行
249:GA (Go Ahead)继续进行
250:SB 子选项开始
251:WILL 指示希望开始执行,或者确认现在正在操作指示的选项
252:WONT 指出拒绝执行或继续招待所指示的选项
253:DO 指出要求对方执行,或者确认希望对方执行指示的选项
254:DONT 指出要求对方停止执行,或者确诊要求对方停止执行指示的选项
(3) 选项
> 1:ECHO 回显
3:SGA 抑制继续进行
5:STATUS 状态
6:TIMING 定时标记
24:TERMTYPE 终端类型
31:NAWS (NegotiateAboutWindowSize)协商窗口的尺寸
32:TERMSPEED 终端速率
33:TFLOWCNTRL 远程流量控制
36:ENVIRON 环境变量
37:AUTHENTICATION
2、协商
在telnet会话发起的时候,双方会有一些协商工作,251(WILL)、252(WONT)、253(DO)、254(DONT)这4个命令就是 用来协商的。远端会主动发送一些协商信息,有些设备只是向客户端发送一些通知信息,而有些设备非要客户端进行协商确认以后才能进行下一步的登录工作。
下面是一些厂家设备发送过来的协商命令实例,及需要客户端需要进行的确认工作(为便于查看,所有的字段全都用花括号扩了起来):
AIX : {Iac}{Dont}{37}{Iac}{Do}{24}
需要回一个{Iac}{Wont}{24},才能继续下一步的登录过程
RiverStone : {Iac}{Will}{3}{Iac}{Do}{1}{Iac}{Do}{31}{Iac}{Will}{5}{Iac}{Do}{33}
需要回一个{Iac}{Wont}{31},才能继续下一步的登录过程
Cisco : {Iac}{Will}{1}{Iac}{Will}{3}{Iac}{Do}{24}{Iac}{Do}{31}
不需要回复,直接进入登录过程
Huawei : {Iac}{Will}{1}{Iac}{Will}{3}{Iac}{Do}{24}
不需要回复,直接进入登录过程
ZTE : {Iac}{Will}{1}{Iac}{Do}{31}{Iac}{Do}{24}{Iac}{Do}{32}{Iac}{Will}{3}
不需要回复,直接进入登录过程
二、利用Winsock控件访问网络
1、Winsock状态
(0) = "sckClosed" ' 缺省的,关闭
(1) = "sckOpen" ' 打开
(2) = "sckListening" ' 侦听
(3) = "sckConnectionPending" ' 连接挂起
(4) = "sckResolvingHost" ' 识别主机
(5) = "sckHostResolved" ' 已识别主机
(6) = "sckConnecting" ' 正在连接
(7) = "sckConnected" ' 已连接
(8) = "sckClosing" ' 同级人员正在关闭连接
(9) = "sckError" ' 错误
2、连接远端服务器
Winsock1.RemoteHost = "xxx.xxx.xxx.xxx"
Winsock1.RemotePort = 23
Winsock1.Connect
连接成功后,会触发Winsock1_Connect事件,同时State成为sckConnected
如果连接超时,会触发错误号为10060 的Winsock1_Error事件
3、和远端服务器断开
本地主动断开
Winsock1.Close
Do
Loop Until Winsock1.State = 0
本地主动断开连接不会主动触发Winsock1_Close事件,可以根据State=sckClosed 判断是否成功断开。
远端主动断开
远端主动断开连接触发Winsock1_Close事件,同时state成为sckClosing,需要执行Winsock1.Close来完成断开操作。
如果长时间没有数据交换,会产生超时错误,会触发错误号为10053 的Winsock1_Error事件
4、接收数据
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long )
Dim CH() As Byte
Dim i As Long
If (bytesTotal > 0) Then
Winsock1.GetData CH, vbByte + vbArray , bytesTotal
For i = 0 To bytesTotal - 1
........
Next
End If
End Sub
客户端收到数据后会触发Winsock1_DataArrival事件,将所有数据读入byte数组后进行处理。
5、发送数据
Winsock1.SendData string
Winsock1.SendData byte
SendData方法可以发送多种类型的数据,需要注意的是对于32-127之间的字符可以利用字符串的方式发送,但是对于telnet的命令,通过chr$(255) & chr$(252) & chr$(24)这种拼接成字符串再发送的方式是不行的,必须把这些字符一个一个发送出去 ,网上有个MyTelnet的VB实例程序,对各种telnet命令都有比较完整的响应,但是是用拼接字符串的方式实现的,所以程序一直不能运行。我还没有试验是否可以利用byte array的方式发送。