標籤:
雜談 |
本來以爲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的方式發送。