VB6做一个自动登录路由器

<div class="articalTitle">
<h2 id="t_4982e8a00100f2l3" class="titName SG_txta">VB6做一个自动登录路由器</h2>
<span class="time SG_txtc">(2009-09-04 14:52:37)</span>
<div class="turnBoxzz">
<a id="quote_set_sign2" class="SG_aBtn SG_aBtn_ico SG_turn"><cite><img class="SG_icon SG_icon111" src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" alt="" width="15" height="15" align="absmiddle">
转载</cite>
</a>
</div>
</div>
<div id="sina_keyword_ad_area" class="articalTag">

<table border="0"><tbody><tr>
<td class="blog_tag">

<span class="SG_txtb">标签:</span>
<h3>
<a href="http://uni.sina.com.cn/c.php?t=blog&amp;k=%D4%D3%CC%B8&amp;ts=bpost&amp;stype=tag" target="_blank">杂谈</a>
</h3>
</td>
<td class="blog_class">
</td>
</tr></tbody></table>
</div>
<div id="sina_keyword_ad_area2" class="articalContent  ">
要用VB6做一个自动登录路由器,提取设备状态的程序,研究了一下如何利用VB进行telnet的工作。
<p>
  本来以为telnet很简单,客户端把登录帐号和命令发过去,对端返回结果就行了。其实在telnet过程中,双方还会互相发送一些命令,这些命令有些大概的作用是通知、协商或者控制。</p>
<p><span style="color: #0000cc; font-size: large;"><strong>一、TELNET协议简介</strong>
</span>
</p>
<p><span style="font-size: medium;"><strong>1、参考</strong>
</span>
</p>
<p><span style="">  telnet的命令格式大概是这样,分3个或4个字段,每个字段一个字节。</span>
</p>
<p align="center"><span style="font-size: medium;"><strong><span style="color: #0099cc;">前导</span>
<span style="color: #006600;">命令</span>
<span style="color: #ff0000;">选项</span>
[<span style="color: #ff00ff;">子选项</span>
]</strong>
</span>
</p>
<p>  下面是详细资料:</p>
<p><strong><span style="font-size: small;">(1)前导</span>
</strong>
<br>
    255:IAC,表示其后的数据为命令和选项</p>
<p><strong><span style="font-size: small;">(2)命令<br></span>
</strong>
    236:EOF
文件结束符<br>
    237:SUSP 挂起当前进程(作业控制)<br>
    238:ABORT异常中止进程<br>
    239:EOR 记录结束符<br>
    240:SE
子选项结束<br>
    241:NOP 无操作<br>
    242:DM
(Data Mark) 数据标记<br>
    243:BRK (Break)中断<br>
    244:IP(Interrupt
Process)中断进程<br>
    245:AO
(Abort Output)异常中止输出<br>
    246:AYT (Are You
There)对方是否还在运行<br>
    247:EC
(Erase Character)<br>
    248:EL
(Erase Line)删除行<br>
    249:GA
(Go Ahead)继续进行<br>
    250:SB
子选项开始<br>
    251:WILL 指示希望开始执行,或者确认现在正在操作指示的选项<br>
    252:WONT 指出拒绝执行或继续招待所指示的选项<br>
    253:DO
指出要求对方执行,或者确认希望对方执行指示的选项<br>
    254:DONT 指出要求对方停止执行,或者确诊要求对方停止执行指示的选项</p>
<p><strong><span style="font-size: small;"><strong><span style="font-size: small;">(3)</span>
</strong>
选项</span>
</strong>
<br>
&gt;    1:ECHO 回显<br>
     3:SGA 抑制继续进行<br>
     5:STATUS 状态<br>
     6:TIMING 定时标记<br>
    24:TERMTYPE 终端类型<br>
    31:NAWS (NegotiateAboutWindowSize)协商窗口的尺寸<br>
    32:TERMSPEED 终端速率<br>
    33:TFLOWCNTRL 远程流量控制<br>
    36:ENVIRON 环境变量<br>
    37:AUTHENTICATION</p>
<p><span style="font-size: medium;"><strong>2、协商</strong>
</span>
</p>
<p>
  在telnet会话发起的时候,双方会有一些协商工作,251(WILL)、252(WONT)、253(DO)、254(DONT)这4个命令就是
用来协商的。远端会主动发送一些协商信息,有些设备只是向客户端发送一些通知信息,而有些设备非要客户端进行协商确认以后才能进行下一步的登录工作。</p>
<p>
  下面是一些厂家设备发送过来的协商命令实例,及需要客户端需要进行的确认工作(为便于查看,所有的字段全都用花括号扩了起来):</p>
<p><span style=""><strong>AIX</strong>

{Iac}{Dont}{37}{Iac}{Do}{24}<br>
    需要回一个{Iac}{Wont}{24},才能继续下一步的登录过程<br><strong>RiverStone</strong>
:{Iac}{Will}{3}{Iac}{Do}{1}{Iac}{Do}{31}{Iac}{Will}{5}{Iac}{Do}{33}<br>

    需要回一个{Iac}{Wont}{31},才能继续下一步的登录过程<br><strong>Cisco</strong>

{Iac}{Will}{1}{Iac}{Will}{3}{Iac}{Do}{24}{Iac}{Do}{31}<br>
    不需要回复,直接进入登录过程<br><strong>Huawei</strong>

{Iac}{Will}{1}{Iac}{Will}{3}{Iac}{Do}{24}<br>
    不需要回复,直接进入登录过程<br><strong>ZTE</strong>

{Iac}{Will}{1}{Iac}{Do}{31}{Iac}{Do}{24}{Iac}{Do}{32}{Iac}{Will}{3}<br>

    不需要回复,直接进入登录过程</span>
</p>
<p><span style="color: #0000cc; font-size: large;"><strong>二、利用Winsock控件访问网络</strong>
</span>
</p>
<p><span style="font-size: medium;"><strong>1、Winsock状态</strong>
</span>
</p>
<p><span style="">  (0) =
"sckClosed"
'缺省的,关闭<br>
  (1) =
"sckOpen"
' 打开<br>
  (2) =
"sckListening"
' 侦听<br>
  (3) = "sckConnectionPending"
' 连接挂起<br>
  (4) =
"sckResolvingHost"
' 识别主机<br>
  (5) =
"sckHostResolved"
' 已识别主机<br>
  (6) =
"sckConnecting"
' 正在连接<br>
  (7) =
"sckConnected"
' 已连接<br>
  (8) =
"sckClosing"
' 同级人员正在关闭连接<br>
  (9) =
"sckError"
' 错误</span>
</p>
<p><span style="font-size: medium;"><strong>2、连接远端服务器</strong>
</span>
</p>
<div style="background-color: #ffffff;">
<p><span style="font-family: Courier New;">Winsock1.RemoteHost =
"xxx.xxx.xxx.xxx"<br>
Winsock1.RemotePort = <span style="color: #ff0000;">23</span>
<br>
Winsock1.Connect</span>
</p>
</div>
<p>  连接成功后,会触发Winsock1_Connect事件,同时State成为sckConnected</p>
<p>  如果连接超时,会触发错误号为<strong><span style="color: #ff00ff;">10060</span>
</strong>
的Winsock1_Error事件</p>
<p><span style="font-size: medium;"><strong>3、和远端服务器断开</strong>
</span>
</p>
<p><strong>本地主动断开</strong>
</p>
<div style="background-color: #ffffff;">
<p><span style="font-family: Courier New;">Winsock1.Close<br><span style="color: #0000ff;">Do</span>
<br><span style="color: #0000ff;">Loop</span>
<span style="color: #0000ff;">Until</span>
Winsock1.State = <span style="color: #ff0000;">0</span>
</span>
</p>
</div>
<p>  本地主动断开连接不会主动触发Winsock1_Close事件,可以根据State=sckClosed
判断是否成功断开。</p>
<p><strong>远端主动断开</strong>
</p>
<p>
  远端主动断开连接触发Winsock1_Close事件,同时state成为sckClosing,需要执行Winsock1.Close来完成断开操作。</p>
<p>  如果长时间没有数据交换,会产生超时错误,会触发错误号为<strong><span style="color: #ff00ff;">10053</span>
</strong>
的Winsock1_Error事件</p>
<p><span style="font-size: medium;"><strong>4、接收数据</strong>
</span>
</p>
<div style="background-color: #ffffff;">
<p><span style="font-family: Courier New;"><span style="color: #0000ff;">Private
Sub</span>
Winsock1_DataArrival(<span style="color: #0000ff;">ByVal</span>
bytesTotal <span style="color: #0000ff;">As Long</span>
)<br><span style="color: #0000ff;">Dim</span>
CH() <span style="color: #0000ff;">As Byte</span>
<br><span style="color: #0000ff;">Dim</span>
i <span style="color: #0000ff;">As Long</span>
<br><br><span style="color: #0000ff;">If</span>
(bytesTotal &gt; 0) <span style="color: #0000ff;">Then</span>
<br>

Winsock1.GetData CH, <span style="color: #990099;">vbByte</span>
+
<span style="color: #990099;">vbArray</span>
, bytesTotal<br><span style="color: #0000ff;">For</span>
i = 0 <span style="color: #0000ff;">To</span>
bytesTotal - 1<br>
........<br><span style="color: #0000ff;">Next</span>
<br><span style="color: #0000ff;">End If</span>
<br><span style="color: #0000ff;">End Sub</span>
</span>
</p>
</div>
<p>  客户端收到数据后会触发Winsock1_DataArrival事件,将所有数据读入byte数组后进行处理。</p>
<p><span style="font-size: medium;"><strong>5、发送数据</strong>
</span>
</p>
<div style="background-color: #ffffff;">
<p><span style="font-family: Courier New;">Winsock1.SendData <span style="color: #ff0000;">string</span>
<br>
Winsock1.SendData <span style="color: #ff0000;">byte</span>
</span>
</p>
</div>
<p>  SendData方法可以发送多种类型的数据,需要注意的是<span style="color: #ff6600;"><strong>对于32-127之间的字符可以利用字符串的方式发送,但是对于telnet的命令,通过chr$(255)
&amp; chr$(252) &amp;
chr$(24)这种拼接成字符串再发送的方式是不行的,必须把这些字符一个一个发送出去</strong>
</span>
,网上有个MyTelnet的VB实例程序,对各种telnet命令都有比较完整的响应,但是是用拼接字符串的方式实现的,所以程序一直不能运行。我还没有试验是否可以利用byte
array的方式发送。</p>
</div>

你可能感兴趣的:(vb)