VB6做一個自動登錄路由器

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    (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的方式發送。

發佈了30 篇原創文章 · 獲贊 8 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章