VB6做一个自动登录路由器

来源:互联网 发布:淘宝巴克110 编辑:程序博客网 时间:2024/06/09 14:13

VB6做一个自动登录路由器

(2009-09-04 14:52:37)
转载
标签:

杂谈

要用VB6做一个自动登录路由器,提取设备状态的程序,研究了一下如何利用VB进行telnet的工作。

  本来以为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    (InterruptProcess)中断进程
    245:AO   (Abort Output)异常中止输出
    246:AYT   (Are YouThere)对方是否还在运行
    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、接收数据

PrivateSub Winsock1_DataArrival(ByValbytesTotal 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命令都有比较完整的响应,但是是用拼接字符串的方式实现的,所以程序一直不能运行。我还没有试验是否可以利用bytearray的方式发送。

原创粉丝点击