WinSock簡介
Socket最初是由加州大學伯克利分校開發的,作為UNIX操作系統的網絡通信接口。隨著UNIX的廣泛使用,Socket已經成為目前最流行的網絡通信應用接口之壹。20世紀90年代初,Sun Microsystems、JSB、FTP Software、Microdyne和微軟等幾家公司聯合定制了壹套標準,即Windows Socket規範,簡稱WinSock。
用VB寫網絡程序主要有兩種方式:1.winsock控件2.winsockAPI。
二、WinSock控件的使用
1的主要屬性。WinSock控件
A.協議屬性
Protocol屬性允許您設置WinSock控件用來連接到遠程計算機的協議。可選協議是VB對應TCP和UDP的常量分別是sckTCPProtocol和sckUDPProtocol,Winsock控件的默認協議是TCP。註意:雖然協議可以在運行時設置,但必須在連接未建立或斷開後設置。
B.SocketHandle屬性
SocketHandle返回當前套接字連接的句柄,這是壹個只讀屬性。
C.RemoteHostIP屬性
RemoteHostIP屬性返回遠程計算機的IP地址。在客戶端,當使用控件的Connect方法時,遠程計算機的IP地址被分配給RemoteHostIP屬性,而在服務器端,在ConnectRequest事件之後,遠程計算機(客戶端)的IP地址被分配給該屬性。如果使用UDP協議,則在DataArrival事件之後,發送UDP消息的計算機的IP將被分配給該屬性。
D.ByteReceived屬性
返回當前接收緩沖區中的字節數。
E.國家財產
返回WinSock控件的當前狀態
常量值描述
SckClosed 0默認值,off。
SckOpen 1已打開。
聽力2
SckConnectionPending 3連接已掛起
SckResolvingHost 4標識主機。
SckHostResolved 5已識別出主機。
SckConnecting 6正在連接。
SckConnected 7已連接。
SckClosing 8個對等方正在關閉連接。
SckError 9錯誤
2.WinSock主要方法
A.綁定方法
使用Bind方法,可以為該控件固定壹個端口號,以便其他應用程序不能再使用該端口。
B.傾聽方法
Listen方法僅在使用TCP協議時有用。它將應用程序置於監聽檢測狀態。
C.連接方法
當本地計算機想要與遠程計算機建立連接時,它可以調用connect方法。
Connect方法調用的規範是:
連接遠程主機,遠程端口
D.接受方法
當服務器收到客戶端的連接請求時,服務器有權決定是否接受客戶端的請求。
E.SendData方法
連接建立後,要發送數據,可以調用SendData方法,該方法只有壹個參數,即要發送的數據。
F.GetData方法
當本地計算機從遠程計算機接收數據時,數據被存儲在緩沖區中。要從緩沖區獲取數據,可以使用GetData方法。GetData方法調用規範如下:
GetData數據,[類型,][maxLen]
它從緩沖區中獲取maxLen長度最長的數據,並將其作為type存儲在data中。獲得數據後,它清空相應的緩沖區。
G.PeekData方法
類似於GetData方法,但PeekData在獲取數據後不會清空緩沖區。
3.Winsock控件主事件
A.ConnectRequest事件
當本地計算機收到遠程計算機發送的連接請求時,將觸發控件的ConnectRequest事件。
B.SendProgress事件
當壹端的計算機向另壹端的計算機發送數據時,會觸發SendProgress事件。SendProgress事件記錄發送的字節數和當前狀態下剩余的字節數。
C.發送完成事件
當所有數據傳輸完成時觸發。
D.數據到達事件
建立連接後,當接收到新數據時,將觸發該事件。註意:如果在接收到新數據之前緩沖區不為空,則不會觸發此事件。
E.錯誤事件
工作中出現任何錯誤都會觸發此事件。
例子見附件。
第三,WinSockAPI的使用
1.WSAStartup函數
為了在妳的應用中調用任何壹個Winsock API函數,妳首先需要做的就是通過WSAStartup函數初始化Winsock服務,所以妳需要調用WSAStartup函數。
聲明函數WSAStartup Lib " ws2 _ 32.dll " _
(ByVal wversionlong,lpWSAData As WSAData)Long
該函數有兩個參數:wVersionRequired和lpWSAData。wVersionRequired參數定義Windows套接字可以提供的最高版本。它的高位字節定義了次版本號,低位字節定義了主版本號。下面是VB中使用的Winsock版本的兩個例子:
初始化版本1.1。
lngRetVal = wsa startup(& amp;H101,udtWinsockData)
初始化版本2.2
lngRetVal = wsa startup(& amp;H202,udtWinsockData)
第二個參數是WSADATA的數據結構,它在執行Windows Sockets時接收數據。
WSAData標牌
整數形式的wVersion
整數形式的wHighVersion
SZ description As String * wsa description _ LEN
szSystemStatus As String * wsa sys _ STATUS _ LEN
整數形式的iMaxSockets
iMaxUdpDg為整數
lpVendorInfo為Long
結束類型
下表描述了數據成員:
字段描述
Windows套接字版本信息。
WHighVersion是通過加載庫文件來支持Winsock的最高版本。
它通常與wVersion值相同。
SZ描述執行時對Windows套接字的詳細描述。
SzSystemStatus包含相關的狀態和配置信息。
IMaxSockets表示同時打開的套接字的最大數量,0表示沒有限制。
IMaxUdpDg表示可以同時打開的數據報的最大數量,0表示沒有限制。
LpVendorInfo供應商指定的信息保留
Winsock版本1.1和2.2中沒有lpVendorInfo的返回值。由於winsock 2支持多種傳輸協議,iMaxSockets和iMaxUdpDg只能在只支持TCP/TP的winsock1.1中使用。要在Winsock 2中獲取這些值,可以使用WSAEnumProtocols函數。
如果成功或返回錯誤代碼,該函數返回0。
錯誤代碼含義
WSASYSNOTREADY指出,網絡還沒有做好傳輸的準備。
WSAVERNOTSUPPORTED當前的WinSock實現不支持應用程序指定的Windows套接字規範版本。
WSAEINPROGRESS正在進行阻塞WinSock調用。
WSAEPROCLIM請求的協議沒有在系統中配置,或者沒有支持它的實現。
Wsaedefault lpwsadata不是有效的指針。
2.WSACleanup函數
每次調用WSAStartup函數,都需要調用WSACleanup函數,通知系統卸載庫文件,清空分配的資源。這個函數非常簡單,沒有任何參數:
將函數WSACleanup Lib“ws2 _ 32 . dll”()聲明為Long
3.建立套接字函數
聲明函數套接字庫“ws2 _ 32 . dll”(ByVal af As Long,_
ByVal s_type為Long,
ByVal協議壹樣長)
該函數有三個參數,定義創建哪種套接字。這三個參數是:
參數描述枚舉類型
af地址系列規範。地址族
s_type新套接字的類型規範。SocketType
協議用於套接字套接字協議的協議
它特定於所指示的地址
家庭。
地址系列:
AF_UNSPEC = 0 '/*未指定*/
AF_UNIX = 1 '/*主機本地(管道、門戶)*/
AF_INET = 2 '/*網間:UDP,TCP等。*/
AF_IMPLINK = 3 '/* arpanet imp地址*/
AF_PUP = 4 '/* pup協議:例如BSP */
AF_CHAOS = 5 '/* mit混沌協議*/
AF_NS = 6 '/* XEROX NS協議*/
AF_IPX = AF_NS '/* IPX協議:IPX、SPX等。*/
AF_ISO = 7 '/* ISO協議*/
AF_OSI = AF_ISO '/* OSI是ISO */
AF_ECMA = 8 '/*歐洲計算機制造商*/
AF_DATAKIT = 9 '/* datakit協議*/
AF_CCITT = 10 '/* CCITT協議,X.25等*/
AF _ SNA = 11 '/* IBM SNA */
AF_DECnet = 12 '/* DECnet */
AF_DLI = 13 '/*直接數據鏈路接口*/
AF_LAT = 14 '/* LAT */
AF _ hy link = 15 '/* NSC Hyperchannel */
AF _ apple talk = 16 '/* apple talk */
AF_NETBIOS = 17 '/* NetBios風格的地址*/
AF _ voice view = 18 '/* voice view */
AF_FIREFOX = 19 '/*來自FIREFOX的協議*/
AF_UNKNOWN1 = 20 '/*有人在用這個!*/
AF_BAN = 21 '/* Banyan */
AF_ATM = 22 '/*本地ATM服務*/
AF_INET6 = 23 '/*互聯網版本6 */
AF _ CLUSTER = 24 '/* Microsoft wolf pack */
AF _ 12844 = 25 '/* IEEE 1284.4 WG AF */
AF_MAX = 26
插座類型:
SOCK_STREAM = 1 ' /*流套接字*/
SOCK_DGRAM = 2 ' /*數據報套接字*/
SOCK _ RAW = 3 '/* RAW-協議接口*/
SOCK_RDM = 4 ' /*可靠傳遞的消息*/
SOCK_SEQPACKET = 5 ' /*有序數據包流*/
協議:
IPPROTO_IP = 0 '/*虛擬IP */
IPPROTO_ICMP = 1 '/*控制消息協議*/
IPPROTO_IGMP = 2 '/*互聯網組管理協議*/
IPPROTO_GGP = 3 '/* gateway^2(已棄用)*/
IPPROTO_TCP = 6 '/* tcp */
IPPROTO_PUP = 12 '/* pup */
IPPROTO_UDP = 17 '/*用戶數據報協議*/
IPPROTO_IDP = 22 '/* xns idp */
IPPROTO_ND = 77 '/*非官方網盤proto */
IPPROTO_RAW = 255 '/*原始IP數據包*/
IPPROTO_MAX = 256
這個函數可以使用特定的協議建立壹個網絡套接字。例如,對於UDP協議,可以這樣寫:
s =套接字(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
s =套接字(AF_INET,SOCK_STREAM,IPPROTO_TCP)
4.關閉套接字功能
將函數close socket Lib“ws2 _ 32 . dll”(ByVal s As Long)聲明為Long
創建套接字時,該函數有壹個Handle參數。
5.連接功能
聲明函數連接庫“ws2 _ 32 . dll”(ByVal s As Long,_
ByRef名稱為sockaddr_in,_
只要,只要
參數
s連接的套接字句柄。
命名建立連接的地址。
namelen連接地址的長度。
返回值
成功時返回0。否則,它返回SOCKET_ERROR和相應的錯誤號Err.LastDllError。
顯然,在調用這個函數時,我們需要知道要連接的計算機的套接字句柄、端口號和主機名(或主機IP地址)。我們知道Winsock控件的Connect方法依賴於兩個變量:RemoteHost和RemotePort。此方法不需要套接字句柄,因為它已經封裝在COM對象中。您可能認為connect函數也應該接受相同的變量設置,然而,事實並非如此。connect函數的主機地址和端口號的傳輸依賴於sockaddr_in結構。
公共類型sockaddr_in
sin_family為整數
sin_port為整數
sin_addr壹樣長
sin_zero(1到8)作為字節
結束類型
6.套接字幫助函數
聲明函數綁定庫“ws2 _ 32 . dll”(ByVal s As Long,_
ByRef名稱為sockaddr_in,_
ByRef namelen壹樣長
s是使用Socket函數創建的套接字,name是指向描述通信對象的結構的指針,namelen是該結構的長度。繩結
該結構中的組件包括:
IP地址:對應name.sin _ addr.s _ addr。
端口號:對應name.sin_port。
端口號用於表示同壹臺計算機上的不同進程(即應用程序),有兩種方式來分配它們:
第壹種分配方法是進程讓系統自動為socket分配壹個端口號,只需要在調用bind之前指定端口號為0。系統自動分配的端口號在1024到5000之間,保留1到1023之間的任何TCP或UDP端口。系統不允許任何進程使用保留端口,除非其有效用戶ID為零(即超級用戶)。
第二種分配方法是進程為套接字指定壹個特定的端口。這對於需要為套接字分配壹個眾所周知的端口的服務器非常有用。指定的範圍介於1024和65536之間。
地址類型:對應name.sin_family,壹般賦值為AF_INET,表示壹個互聯網地址(即IP地址)。IP地址通常用點號表示,但實際上是壹個32位的長整數,可以用inet_addr()函數轉換。
7.套接字監聽函數
聲明函數listen Lib“ws2 _ 32 . dll”(ByVal s為Long,ByVal backlog為Long)為Long
listen函數用於將套接字設置為監聽狀態,這表示套接字準備好連接。註意,這個函數壹般用在服務程序中,其中s是使用Socket函數創建的套接字,backlog參數用於設置等待連接的客戶端數量。
8.接受連接請求
聲明函數accept Lib“ws2 _ 32 . dll”(ByVal s為Long,ByRef addr為sockaddr_in,_
ByRef addrlen壹樣長)
服務器應用程序調用這個函數接受客戶端套接字的連接請求,accept()函數的返回值是壹個新的套接字,可以用來完成服務器和客戶端之間的信息發送和接收,而原來的套接字仍然可以接受其他用戶的連接請求。
9.接收信息
聲明函數recv Lib“ws2 _ 32 . dll”(ByVal s As Long,_
ByRef buf As Any,_
ByVal buflen作為長,_
ByVal標誌壹樣長)壹樣長
s是已連接套接字的標識符。
緩沖buf接收的數據
鏡頭緩沖長度
Flags指定從中調用的標識。
第壹個參數是套接字的句柄——套接字函數的返回值。也就是說:我們需要告訴recv函數是哪個套接字在訪問該函數。
第二個參數是:函數執行後可以加載壹些數據的緩沖區。但不壹定要足夠長才能接收到Winsock緩沖區中的所有數據,緩沖區的大小限制在8192字節(8千字節)。因此,如果Winsock緩沖區中的數據大小大於recv函數的緩沖區,則必須多次調用該函數,直到獲得所有數據。
如果應用程序定義了緩沖區的長度,recv函數必須知道緩沖區可以容納多少字節。第三個參數就是為了這個目的。
最後壹個參數是可選的,我們今天不使用它。這個參數有兩個選擇標誌:MSG_PEEK和MSG_OOB,用於改變函數的行為。
MSG_PEEK從輸入數據中獲取數據。數據被復制到緩沖區,但不會從輸入隊列中刪除。函數返回當前準備接收的字節數。
MSG_OOB處理OOB(帶外)數據。網絡上有兩種類型的數據包,普通數據包和帶外數據包。可以通過檢查TCP/IP報頭的特定標誌來確定帶外外包。
10.發送信息
聲明函數send Lib " ws2 _ 32 . dll "(ByVal s As Long,_
ByRef buf As Any,_
ByVal buflen作為長,_
ByVal標誌壹樣長)壹樣長
請參閱收到的參數信息。
第四,服務器與客戶端交互
目前最常用的方法是服務程序在壹個眾所周知的地址(包括端口信息)監聽服務請求,即服務進程壹直處於休眠狀態,直到有客戶向這個服務的地址發出連接請求。這時,服務程序被喚醒,並適當地響應客戶的請求。請註意,服務器和客戶端之間的交互可以是面向連接的(基於流套接字),也可以是無連接的(基於數據報套接字)。
計算機網絡服務器
插座()
|
綁定()
|
Listen()客戶端
|
|插座()
|建立聯系|
accept()& lt;-連接()
|請求數據|
recv()& lt;-發送()
| |
處理服務請求|
|響應數據|
send()-& gt;接收()
| |
關閉()關閉()
動詞 (verb的縮寫)其他人
比較:WinSock控件
優點:使用簡單,工作量小。
缺點:很少有功能只支持TCP和UDP協議,需要WinSock控件(系統安裝沒有MSWINSCK。默認為OCX文件)。
適合初學者
溫索卡皮
優點:功能強大,支持多種協議,使用靈活。WinSockAPI調用的wsock32.dll(28k)或ws2_32.dll(69K)自帶Windows系統函數庫,不用擔心文件不夠用。
缺點:使用復雜,編程量大,需要壹定的基礎。
適合要求苛刻的網絡程序。
/tech/program/22649.html