Winsock屬性、方法介紹
Winsock是Mcrosoft windows提供的網路程式設計介面,它供了基於TCP/IP協議介面實現方法.通過網路進行的資料通訊,需要用地址來表示網路中的主機.TCP/IP協議使用IP地址來作為主機的標識.實現的連線方式是通過IP地址來識別的.通常情況下每臺裝置執行的不止一個程式,所以為了使用應用程式間的連線,還需要建立一個地址標識.在TCP/IP中使用埠來作為標識號(PORT).IP地址+埠地址.
TCP:實現提供雙向,有序無從復的資料流服務,流量控制+差錯檢測+糾錯等功能.
1.VB控制元件winsock是個執行中不可件的控制元件,常用屬性如下:
byte received 接收到的位元組數
local hostname 本地機器名
Local IP 本地IP地址
Local port 本地通訊程式的埠
Remote host 遠端機器名
Remote host IP 遠端IP地址
Remote port 遠端通訊程式埠
Socket handle 提供呼叫API得控制代碼引數
State 連線得當前狀態
Protocol 使用協議
Bytereceived:反應接收到得資料量,以位元組為單位。
State:返回當前連線狀態
0 關閉狀態
1 開啟狀態
2 監聽狀態
3 連線掛起
4 解析域名
5 正在連線
6 以建立連線
7 正在關閉
8 出錯
2.控制元件
accept接受一個連線請求。格式:物件.accept request ID
bind:多協議介面下,把介面卡,IP地址捆綁再一起。格式:物件。Bina埠號,ip地址
close:關閉連線。格式:物件。Close
connect:傳送連線請求。格式:物件。Connect〔ip,遠端埠〕
getdata:取出資料後清除緩衝區。
Peekdata:取出資料後不清楚緩衝區。格式:物件。Getdata(peekdata)變數〔,資料型別〔,最大長度〕〕
Listen:偵聽。格式:物件。Listen
Senddata:傳送資料。格式:物件。Senddata
3.控制元件事件
Close 遠端裝置關閉連線時觸發事件
Connect 建立連線,進行通訊時觸發
Connectrequest 有連線請求時觸發
Data arrival 有資料到達時觸發
Error 錯誤時觸發
Send complete 完成一次資料傳送觸發
Send progress 資料傳送進度
Winsock的方法屬性
Winsock控制元件對使用者是不可視的,可以很容易地訪問TCP和UDP網路服務。TOM注:製作網路通訊軟體,應該沒有比VB+WINSOCK控制元件更簡單的方案了吧? 其可以被Microsoft Access, Visual Basic ,Visual C++或Visual FoxPro開發人員使用。 用Winsock控制元件編寫客戶和伺服器應用程式,不需要了解TCP或呼叫底層Winsock API的具體細節。
Winsock控制元件使用手冊
本文使用Word2000排版,如你閱讀時版面較凌亂,請使用Word2000閱讀。
Winsock控制元件對使用者是不可視的,可以很容易地訪問TCP和UDP網路服務。TOM注:製作網路通訊軟體,應該沒有比VB+WINSOCK控制元件更簡單的方案了吧?
其可以被Microsoft Access, Visual Basic ,Visual C++或Visual FoxPro開發人員使用。
用Winsock控制元件編寫客戶和伺服器應用程式,不需要了解TCP或呼叫底層Winsock API的具體細節。
通過設定Winsock控制元件的屬性和呼叫該控制元件的方法,可以很容易地連線到遠端計算機並進行雙向的資料交換。
TCP基本知識
TCP(Transfer Control Protocol)允許你建立並維護一個與遠端計算機的連線,使用該連線,兩臺計算機之間就可以交換資料了。
如果你在建立一個客戶應用程式,你必須知道伺服器計算機的名字T注:建議用IP地址或IP地址(RemoteHost屬性),以及要監聽的埠號(RemotePort屬性),然後呼叫Connect方法。
如果你在建立一個伺服器應用程式,設定要監聽的埠號(LocalPort屬性),呼叫Listen方法。當客戶建立連線請求時,產生ConnectionRequest事件。要完成該連線,在ConnectionRequest事件中呼叫Accept方法。
一旦建立了連線,兩臺計算機之間就可以傳送和接受資料了。要傳送資料,呼叫SendData方法。當接受資料時,產生DataArrival事件。在DataArrival事件中呼叫GetData方法來檢取資料。
UDP基本知識
UDP(User Datagram Protocol)是無連線的協議。
與TCP操作不同,計算機並不建立一個連線。並且,UDP應用程式可以是客戶也可以是伺服器。
要傳輸資料,首先設定客戶計算機的LocalPort屬性。伺服器計算機T注:實際含義是指傳送方只需要將RemoteHost屬性設定為客戶計算機T注:實際上的意思是指接收方的IP地址,將RemotePort屬性設定為客戶計算機上的LocalPort屬性值,然後呼叫SendData方法開始傳送資料。客戶計算機在DataArrival事件中使用GetData方法檢取資料。
Winsock控制元件的屬性
BytesReceived屬性,
LocalHostName屬性,
LocalIP屬性,
LocalPort屬性,
RemoteHost屬性(ActiveX控制元件),
SocketHandle屬性,
State屬性(Winsock控制元件),
Protocol屬性(Winsock控制元件),
Name屬性,
Parent屬性,
RemoteHost屬性(ActiveX控制元件),
RemotePort屬性(ActiveX控制元件),
Index屬性(ActiveX控制元件),
Tag屬性(ActiveX控制元件),
Object屬性(ActiveX控制元件)。
Winsock控制元件的方法
Accept方法,
Bind方法,
Close方法(Winsock控制元件),
Listen方法,PeerData方法,
SendData方法,
GetData方法(WinSock控制元件),
GetData方法(ActiveX控制元件)。
Winsock控制元件的事件
Close事件,
ConnectionRequest事件,
DataArrival事件,
SendComplete事件,
SendProgress事件T注:該事件表示開始傳送了,傳送中,好像一般用不到,所以沒有說明
Error事件,
Connect事件(Winsock控制元件),
Connect事件。
請參閱可捕獲的Internet Transfer 控制元件錯誤,使用Winsock控制元件。
以下的內容以字母為序排列
Accept方法
只對於TCP伺服器應用程式適用。
該方法用於在處理ConnectionRequest事件時接受連入請求。
應用於Winsock控制元件。
語法object.Accept requested
object是Winsock控制元件的物件表示式。
資料型別Long
返回值Void
說明
在ConnectionRequest事件中使用Accept方法。
ConnectionRequest事件相應的引數RequestID也應傳遞給Accept方法。下面是一個例子:
Private Sub Winsock1_ConnectionRequest _(ByVal requestID As Long)
' Close the connection if it is currently open
' by testing the State property.
If Winsock1.State <> sckClosed Then
Winsock1.Close
' Pass the value of the requestID parameter to the' Accept method.
Winsock1.Accept requested
End Sub
T注:該例寫得不是太好,應在新的控制元件例項中使用該方法,即動態地載入(LOAD)一個新的WINSOCK控制元件,用新控制元件而不是處於監聽狀態的控制元件去連線
請參閱Connect方法,ConntectionRequest事件。
下面示例的例子列出了使用TCP連線Winsock控制元件必須的程式碼,使用RequestID標識請求,該引數傳遞給接受請求的Accept方法。
Private Sub WinsockTCP_ConnectionRequest _(requestID As Long)
If Winsock1.State <> sckClosed Then
Winsock1.Close
Winsock.Accept requested
End Sub
T注:這就對了!請注意,這次換了個新的SOCK來進行連線,但好像又少了個ENDIF!唉,真是誤人子弟:)
Bind方法
指定TCP連線中使用的LocalPort和LocalIP。T注:該用法比較少見,更多的是用在UDP通訊中,指定伺服器駐守的埠如果你有多個協議介面卡,使用該方法。應用於Winsock控制元件。
語法
object.Bind LocalPort, LocalIP
Bind方法的語法有如下幾個部分:
部分 描述
object 一個Winsock控制元件的物件表示式
localPort 建立連線所使用的埠號
localIP 建立連線所使用的本地IP地址
說明
在呼叫Listen方法之前你必須呼叫Bind方法T注:未必:)在UDP通訊的伺服器端,倒是要先呼叫BIND方法!
請參閱RemoteHost屬性(ActiveX控制元件),RemotePort屬性(ActiveX控制元件)。
BytesReceived屬性
返回接受資料的數量(當前接受緩衝區中的資料)。使用GetData方法檢取資料。在設計時不可用, 在執行時是隻讀的。
應用於Winsock控制元件。
語法object.BytesReceived
object是Winsock控制元件的物件表示式。
返回值Long
請參閱DataArrival事件。
Close事件
當遠端計算機關閉連線T注:只有TCP是"連線"的,UDP是無"連線"的,或者反過來說,本手冊說"連線"時都是指的TCP時產生該事件。應用程式應使用Close方法正確地關閉一個TCP連線。
應用於Winsock控制元件。
語法object_Close()
object是Winsock控制元件的物件表示式。
引數 沒有
請參閱Close方法(Winsock控制元件)。
Close方法
關閉客戶或伺服器應用程式的TCP連線或監聽插槽。
應用於Winsock控制元件。
語法object.Close
object是一個Winsock控制元件的物件表示式。
引數 沒有
返回值 Void
請參閱Close事件。
Connect 事件
當一個 Connect 操作完成時發生。
應用於Winsock控制元件。
語法object.Connect()
object 置換元代表一個物件表示式,其值是一個 Winsock 控制元件。說明使用 Connect 事件確認已經成功建立了T注:該事件很重要,建議使用該事件而不是別的方法(如STATE的值)來判斷一個連線是否已經成功
Connect方法
返回與遠端計算機的連線T注:就是去連線!
應用於Winsock控制元件。
語法object.Connect remoteHost, remotePort
Connect方法的語法有如下幾個部分:
部分 描述
object 一個Winsock控制元件的物件表示式
remoteHos 要連線的遠端計算機的名字
remotePort 要連線的遠端計算機的埠號
返回值 沒有
說明
當試圖建立一個TCP連線時,你必須呼叫Connect方法。
請參閱Accept方法,ConnectionRequest事件,RemoteHost屬性(ActiveX控制元件),RemotePort屬性(ActiveX控制元件)。
ConnectionRequest事件
當遠端計算機請求一個連線時產生該事件。只對於TCP伺服器應用程式適用。
當有一個連入請求時就觸發該事件。
該事件觸發之後,RemoteHostIP和RemotePort屬性中儲存了客戶機的資訊。
應用於Winsock控制元件。
語法object_ConnectionRequest ( requestID As Long)
ConnectionRequest事件的語法有如下幾個部分:
部分 描述
object 一個Winsock控制元件的物件表示式
requested 連入請求識別符號。
該引數應傳遞給第二個控制元件例項的Accept方法,說明伺服器可以確定是否接受一個連入請求。如果沒有接受連入請求,在客戶將得到Close事件。
適用Accept方法(在新的控制元件例項中)接受連入請求。
請參閱Accept方法,Connect方法。
DataArrival事件
當新資料到達時產生該事件。
應用於Winsock控制元件。
語法object_DataArrival (bytesTotal As Long)
DataArrival事件的語法有如下幾個部分:
部分 描述
object 一個Winsock控制元件的物件表示式
bytesTotal 長整數:可以檢取資料的總數
說明
如果你不在一次GetData呼叫中檢取所有的資料則不產生該事件。只有當新資料到來時才觸發該事件。可以使用BytesReceived屬性檢查可檢取資料的數量。
請參閱BytesReceived屬性,SendData方法,SendComplete事件,SendProgress事件。
下面示例的例子在Winsock控制元件的DataArrival事件中使用了GetData方法。當產生該事件時,程式碼呼叫GetData方法檢取資料並將其儲存在一個字串中。然後將資料寫入一個TextBox控制元件。
Private Sub Winsock1_DataArrival _(ByVal bytesTotal As Long)
Dim strData As String
Winsock1.GetData strData, vbString
Text1.Text = Text1.Text & strData
End Sub
Error事件
後臺程序發生錯誤時產生該事件(如連線失敗,後臺傳送或檢取資料失敗等)。
應用於Winsock控制元件。
語法object_Error(number As Integer, Description As String, Scode As Long,Source As String, HelpFile as String, HelpContext As Long, CancelDisplay AsBoolean).
Error事件的語法有如下幾個部分:
部分 描述
object 一個Winsock控制元件的物件表示式
number 一個整數,指定錯誤碼請參閱"設定"中的常量
description 包含錯誤訊息的字串scode長
SCODEsource 描述錯誤源的字串
HelpFile 包含幫助檔名的字串
HelpContextHelp 檔案環境
CancelDisplay 指明是否取消該顯示動作預設是False,顯示預設的錯誤訊息。如果你不想使用預設的錯誤訊息,可以將其設定為True
設定
number值的設定如下:
常量 值 描 述
SckOutOfMemory 7 記憶體不足
SckInvalidPropertyValue 380 屬性值無效
SckGetNotSupported 394 不能讀取屬性值
SckSetNotSupported 383 屬性是隻讀的
SckBadState 40006 連線事務或請求的協議或
連線狀態不正確
SckInvalidArg 40014 傳遞給函式的引數格式
不正確或範圍不對
SckSuccess 40017 成功
SckUnsupported 40018 不支援的變數型別
SckInvalidOp 40020 對於當前的狀態,該
操作不正確
SckOutOfRange 40021 引數超出了範圍
SckWrongProtocol 40026 連線事務或請求的協議不正確
SckOpCanceled 1004 操作被取消
SckInvalidArgument 10014 請求的地址是廣播地
址,但沒有設定標記
SckWouldBlock 10035 插槽是非阻塞的,指
定的操作將被阻塞
SckInProgress 10036 過程中有阻塞的
Winsock操作
SckAlreadyComplete 10037 操作完成。過程中沒
有阻塞的Winsock操作
SckNonRecoverableError 11003 不可恢復性錯誤
SckNoData1 1004 名字有效,所請求的類
型沒有資料記錄
GetData方法
檢取當前的資料塊,將其儲存在一個Variant型別的變數中T注:實際上只有字串/位元組組兩種型別,參見講座的第四講。
應用於Winsock控制元件。
返回值Void
語法object.GetData data [,type] [,maxLen]
GetData方法的語法有如下幾個部分:
部分 描述
object 一個Winsock控制元件的物件表示式
data 儲存取回來的資料的地方/變數。
如果沒有足夠的空間儲存資料,則data設定為Empty
type,可選引數。要檢取的資料型別,如"設定"中所示
maxLen,可選引數。在檢取位元組矩陣或字串時指定檢取長度。如果沒有指定該引數,則檢取位元組矩陣或字串中的所有資料。如果資料型別不是位元組矩陣或字串,則忽略該引數
設定
type值的設定如下:
描述常量
Byte vbByte
Integer vbInteger
Long vbLong
Single vbSingle
Double vbDouble
Currency vbCurrency
Date vbDate
Boolean vbBoolean
SCODE vbError
String vbString
Byte矩陣 vbArray + vbByte
說明
通常在DataArrival事件中使用GetData方法,其包含了一個totalBytes引數。如果你指定的maxLen比totalBytes引數小,則將得到一個10040警告,表明其餘資料將丟失T注:非萬不得已,不要用該引數,應該一次性地將資料全部取回,再慢慢處理
Listen方法
建立一個插槽,並設定為監聽模式。
該方法只適用於TCP連線。
應用於Winsock控制元件。
語法object.Listen
object是一個Winsock控制元件的物件表示式。
引數 沒有
返回值 Void
說明
當有連入請求時產生ConnectionRequest事件。
在處理ConnectionRequest事件時,應用程式應使用Accept(在新的控制元件例項)方法接受連線。
請參閱Connect方法,Close方法(Winsock控制元件)。
LocalHostName屬性
返回本地計算機的名字。只讀,在設計時不可用。
應用於Winsock控制元件。
語法object.LocalHost Name
object是一個Winsock控制元件的物件表示式。
返回值 String
LocalIP屬性
返回本地計算機的IP地址。只讀屬性,在設計時不可用。
應用於Winsock控制元件。
語法object.LocalIP
object是Winsock控制元件的物件表示式。
資料型別String
LocalPort屬性
返回或設定本地使用的埠。可讀寫,在設計時可用。
對於客戶,這將指定傳送資料的埠。如果應用程式不需要特定的埠,指定為0。在這種情況下,控制元件將隨機選擇一個埠。連線建立後,該本地埠就用於TCP連線。對於伺服器,這是監聽的本地埠。如果指定為0,則隨機選用一個埠。在呼叫了Listen方法之後,屬性包含了實際選中的埠。
應用於Winsock控制元件。
語法object.LocalPort=long
object是一個Winsock控制元件的物件表示式。
資料型別 Long T注:講座中好像搞錯了,實際上長短均可:)
說明
通常使用埠0在兩臺計算機之間動態建立連線。例如,希望伺服器回撥的客戶可以使用埠0隨機選中一個埠號,該埠號將傳遞給遠端的伺服器。
PeekData方法
與GetData方法類似,只是其不從輸入佇列中刪除資料。
應用於Winsock控制元件。
語法object.PeekData data [,type] [,maxLen]
PeekData方法的語法有如下幾個部分:
部分 描述
object 一個Winsock控制元件的物件表示式
data 儲存取回的資料的地方/變數
如果沒有足夠的空間儲存資料,則data設定為Empty。
type可選引數。要檢取的資料型別,如"設定"中所示。預設是vbArray+ vbByte
maxLen可選引數。在檢取位元組矩陣或字串時指定檢取長度。如果沒有指定該引數,則檢取位元組矩陣或字串中的所有資料。
如果資料型別不是位元組矩陣或字串,則忽略該引數
設定
type值的設定如下:
描述 常量
Byte vbByte
Integer vbInteger
Long vbLong
Single vbSingle
Double vbDouble
Currency vbCurrency
Date vbDate
Boolean vbBoolean
SCODE vbError
String vbString
Byte矩陣 vbArray + vbByte
返回值 Void
說明
如果型別指定為vbString,則資料返回給使用者之前轉換為UUICODE。
請參閱GetData方法(Winsock控制元件)。
Protocol屬性
返回或設定Winsock控制元件使用的協議,TCP或UDP。
應用於Winsock控制元件。
語法object.Protocol [=protocol]
object是Winsock控制元件的物件表示式。
設定protocol值的設定如下:
常量 值 描述
sckTCPProtocol 0 預設。使用TCP協議
sckUDPProtocol 1 使用UDP協議
返回值 Void
說明
在重新設定該屬性之前必須關閉控制元件(使用Close方法)。
RemoteHostIP屬性
返回遠端計算機的IP地址。對於客戶應用程式,使用Connect方法建立連線之後,該屬性包含了遠端計算機IP字串。對於伺服器應用程式,進來一個連線請求時,該屬性包含了初始化請求的遠端計算機的IP字串。在使用UDP協議時,在DataArrival事件產生後,該屬性包含了傳送UDP資料的遠端計算機的IP地址。
應用於Winsock控制元件。
語法object.RemoteHostIP
object是Winsock控制元件的物件表示式。
資料型別String
SendComplete事件
當傳送操作完成時產生該事件。
應用於Winsock控制元件。
語法object_SendComplete
object是一個Winsock控制元件的物件表示式。
引數 沒有
請參閱DataArrival事件,SendProgress事件。
SendData方法
給遠端計算機發送資料。
返回值Void
應用於Winsock控制元件。
語法object.SendData data
SendData方法的語法有如下幾個部分:
部分 描 述
object 一個Winsock控制元件的物件表示式
data 要傳送的資料T注:只能傳送字串/位元組組,對
於二進位制資料,應使用位元組矩陣
說明
當傳遞UNICODE字串時,在傳送之前轉換為ANSI字串。
SendProgress事件
在傳送資料時產生該事件。
應用於Winsock控制元件。
語法object_SendProgress (bytesSent As Long, bytesRemaining As Long)
SendProgress事件的語法有如下幾個部分:
部分 描 述
object 一個Winsock控制元件的物件表示式
bytesSent 從上次觸發該事件到現在已傳送資料的位元組數
bytesRemaining 在傳送緩衝區中等待發送資料的位元組數
請參閱DataArrival事件,SendComplete事件。
SocketHandle屬性
返回一個值,該值與Winsock控制元件用來與Winsock層通訊所用的插槽控制代碼相對應。該屬性是隻讀的,在設計時不可用。
應用於Winsock控制元件。
語法object.SocketHandle
object是一個Winsock控制元件的物件表示式。
資料型別 Long
說明
該引數將傳遞給Winsock API。
State屬性
返回控制元件的狀態,以列舉型別表示。該屬性是隻讀的,在設計時不可用。
應用於Winsock控制元件。
語法object.State
object是一個Winsock控制元件的物件表示式。
資料型別 Integer
設定
State屬性的設定如下:
常量 值 描述
SckClosed 0 預設。關閉
SckOpen 1 開啟
SckListening 2 監聽
SckConnectionPending 3 連線未決
SckResolvingHost 4 解析主機
SckHostResolved 5 主機被解析
SckConnecting 6 連線
SckConnected 7 已連線
SckClosing 8 對方在關閉連線
SckError 9 錯誤
T注:不要過於信任STATE屬性,在可以用事件來判斷的時候,應該以所觸發的事件為準來判斷當前的狀態。