Winsock属性 方法介绍
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控件的屬性和調用該控件的方法,可以很容易地連接到遠程計算機并進行雙向的數據交換。
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屬性,在可以用事件來判斷的時候,應該以所觸發的事件為準來判斷當前的狀態。
總結
以上是生活随笔為你收集整理的Winsock属性 方法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中WSAAsyncSelect模型
- 下一篇: 读【36岁IT老人再次随笔】的读后感,你