久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

WinSock控件及WinSockAPI

 zele 2011-02-08
WinSock簡介
      Socket(套接字)最初是由加利福尼亞大學(xué)Berkeley(伯克利)分校為UNIX操作系統(tǒng)開發(fā)的網(wǎng)絡(luò)通信 接口,,隨著UNIX的廣泛使用,Socket成為當(dāng)前最流行的網(wǎng)絡(luò)通信應(yīng)用程序接口之一,。20世紀(jì)90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等幾家公司共同定制了一套標(biāo)準(zhǔn),,即Windows Socket規(guī)范,,簡稱WinSock。

VB編寫網(wǎng)絡(luò)程序主要有兩種方式:1.winsock控件 2.winsockAPI


二,,WinSock控件的使用
1.WinSock控件的主要屬性
a.Protocol屬性
   通過Protocol屬性可以設(shè)置WinSock控件連接遠(yuǎn)程計算機(jī)使用的協(xié)議,。可選的協(xié)議是TCP和UDP對應(yīng)的VB的常量分別是 sckTCPProtocol和sckUDPProtocol,,Winsock控件默認(rèn)協(xié)議是TCP,。注意:雖然可以在運行時設(shè)置協(xié)議,但必須在連接未建 立或斷開連接后,。

b.SocketHandle屬性
   SocketHandle返回當(dāng)前socket連接的句柄,,這是只讀屬性。

c.RemoteHostIP屬性
   RemoteHostIP屬性返回遠(yuǎn)程計算機(jī)的IP地址,。在客戶端,,當(dāng)使用了控件的Connect方法后,遠(yuǎn)程計算機(jī)的IP地址就賦給了 RemoteHostIP屬性,,而在服務(wù)器端,,當(dāng)ConnectRequest事件后,遠(yuǎn)程計算機(jī)(客戶端)的IP地址就賦給了這個屬性,。如果使用的是 UDP協(xié)議那么當(dāng)DataArrival事件后,,發(fā)送UDP報文的計算機(jī)的IP才賦給了這個屬性。

d.ByteReceived屬性
   返回當(dāng)前接收緩沖區(qū)中的字節(jié)數(shù)

e.State屬性
   返回WinSock控件當(dāng)前的狀態(tài)

   常數(shù)                                值    描述
   sckClosed                          0     缺省值,,關(guān)閉,。
   SckOpen                           1     打開。
   SckListening                       2     偵聽
   sckConnectionPending         3     連接掛起
   sckResolvingHost                4     識別主機(jī),。
   sckHostResolved                 5     已識別主機(jī)
   sckConnecting                    6     正在連接,。
   sckConnected                    7     已連接。
   sckClosing                          8     同級人員正在關(guān)閉連接,。
   sckError                             9   錯誤


2.WinSock主要方法
a.Bind方法
   用Bind方法可以把一個端口號固定為本控件使用,,使得別的應(yīng)用程序不能再使用這個端口,。

b.Listen方法
   Listen方法只在使用TCP協(xié)議時有用。它將應(yīng)用程序置于監(jiān)聽檢測狀態(tài),。

c.Connect方法
   當(dāng)本地計算機(jī)希望和遠(yuǎn)程計算機(jī)建立連接時,,就可以調(diào)用Connect方法。
   Connect方法調(diào)用的規(guī)范為:
   Connect RemoteHost,RemotePort

d.Accept方法
   當(dāng)服務(wù)器接收到客戶端的連接請求后,,服務(wù)器有權(quán)決定是否接受客戶端的請求,。

e.SendData方法
   當(dāng)連接建立后,要發(fā)送數(shù)據(jù)就可以調(diào)用SendData方法,,該方法只有一個參數(shù),,就是要發(fā)送的數(shù)據(jù)。

f.GetData方法
   當(dāng)本地計算機(jī)接收到遠(yuǎn)程計算機(jī)的數(shù)據(jù)時,,數(shù)據(jù)存放在緩沖區(qū)中,,要從緩沖區(qū)中取出數(shù)據(jù),可以使用GetData方法,。GetData方法調(diào)用規(guī)范如下:
   GetData data,[type,][maxLen]
   它從緩沖區(qū)中取得最長為maxLen的數(shù)據(jù),,并以type類型存放在data中,GetData取得數(shù)據(jù)后,,就把相應(yīng)的緩沖區(qū)清空,。

g.PeekData方法
   和GetData方法類似,但PeekData在取得數(shù)據(jù)后并不把緩沖區(qū)清空,。


3.Winsock控件主要事件

a.ConnectRequest事件
   當(dāng)本地計算機(jī)接收到遠(yuǎn)程計算機(jī)發(fā)送的連接請求時,,控件的ConnectRequest事件將會被觸發(fā)。

b.SendProgress事件
   當(dāng)一端的計算機(jī)正在向另一端的計算機(jī)發(fā)送數(shù)據(jù)時,,SendProgress事件將被觸發(fā),。SendProgress事件記錄了當(dāng)前狀態(tài)下已發(fā)送的字節(jié)數(shù)和剩余字節(jié)數(shù)。

c.SendComplete事件
   當(dāng)所有數(shù)據(jù)發(fā)送完成時,,被觸發(fā),。

d.DataArrival事件
   當(dāng)建立連接后,接受到了新數(shù)據(jù)就會觸發(fā)這個事件,。注意:如果在接受到新數(shù)據(jù)前,,緩沖區(qū)中非空,就不會觸發(fā)這個事件,。

e.Error事件
   當(dāng)在工作中發(fā)生任何錯誤都會觸發(fā)這個事件,。

例子見附件

三,WinSockAPI的使用

1.WSAStartup 函數(shù)

    為了在你的應(yīng)用程序當(dāng)中調(diào)用任何一個Winsock API 函數(shù),,首先第一件事情你就是必須通過WSAStartup函數(shù)完成對Winsock 服務(wù)的初始化,,因此需要調(diào)用WSAStartup函數(shù)。

Declare Function WSAStartup Lib "ws2_32.dll" _
    (ByVal wVersionRequired As Long, lpWSAData As WSAData) As Long

    這 個函數(shù)有兩個參數(shù): wVersionRequired 和 lpWSAData,。wVersionRequired 參數(shù)定義Windows Sockets 提供能使用的最高版本,,它的高位字節(jié)定義的是次版本號,,低位字節(jié)定義的是主版本號,。下面的2個Winsock版本在VB中使用的例子:

初始化1.1版本

lngRetVal = WSAStartup(&H101, udtWinsockData)


初始化2.2版本

lngRetVal = WSAStartup(&H202, udtWinsockData)


第二個參數(shù)是WSADATA 的數(shù)據(jù)結(jié)構(gòu) ,,它是接收Windows Sockets 執(zhí)行時的數(shù)據(jù)。

Type WSAData
   wVersion       As Integer
   wHighVersion   As Integer
   szDescription  As String * WSADESCRIPTION_LEN
   szSystemStatus As String * WSASYS_STATUS_LEN
   iMaxSockets    As Integer
   iMaxUdpDg      As Integer
   lpVendorInfo   As Long
End Type

數(shù)據(jù)成員的描述在下表中:

Field                       描述
wVersion                Windows Sockets 版本信息,。
wHighVersion           通過加載庫文件得到的最高的支持Winsock 的版本,,
                             它通常和wVersion值相同。
szDescription           Windows Sockets 執(zhí)行時的詳細(xì)描述
szSystemStatus        包含了相關(guān)的狀態(tài)和配置的信息
iMaxSockets             表示同時打開的socket最大數(shù),,為0表示沒有限制,。
iMaxUdpDg               表示同時打開的數(shù)據(jù)報最大數(shù),為0表示沒有限制,。
lpVendorInfo            廠商指定信息預(yù)留

在 Winsock的1.1和2.2版本中沒有l(wèi)pVendorInfo的返回值,。因為winsock 2支持多個傳輸協(xié)議,所以iMaxSockets 和iMaxUdpDg只能在僅支持TCP/TP的winsock1.1中使用,。為了在Winsock 2中獲得這些值,,你可以使用WSAEnumProtocols 函數(shù)。

如果成功或者返回一個錯誤代碼,,則函數(shù)返回 0,。

錯誤代碼                            含義
WSASYSNOTREADY            指出網(wǎng)絡(luò)沒有為傳輸準(zhǔn)備好。
WSAVERNOTSUPPORTED     當(dāng)前的WinSock實現(xiàn)不支持應(yīng)用程序指定的Windows Sockets規(guī)范版本
WSAEINPROGRESS              一個阻塞WinSock調(diào)用正在進(jìn)行
WSAEPROCLIM                   請求的協(xié)議沒有在系統(tǒng)中配置或沒有支持它的實現(xiàn)存在,。
WSAEFAULT                       lpWSAData 不是有效的指針



2.WSACleanup 函數(shù)

每次調(diào)用了WSAStartup函數(shù),,你都需要調(diào)用WSACleanup函數(shù),通知系統(tǒng)來卸載庫文件及清除已分配的資源,,這個函數(shù)十分簡單,,沒有任何參數(shù):

Declare Function WSACleanup Lib "ws2_32.dll" () As Long


3.建立Socket函數(shù)

Declare Function socket Lib "ws2_32.dll" (ByVal af As Long, _
                  ByVal s_type As Long,
                  ByVal Protocol As Long) As Long

函數(shù)有3個參數(shù)定義建立何種socket,三個參數(shù)分別是:
Argument          Description                                           Enum Type
af                     Address family specification.                     AddressFamily
s_type              Type specification for the new socket.      SocketType
Protocol            Protocol to be used with the socket         SocketProtocol
                       that is specific to the indicated address
                       family.

AddressFamily:
    AF_UNSPEC = 0          '/* unspecified */
    AF_UNIX = 1              '/* local to host (pipes, portals) */
    AF_INET = 2              '/* internetwork: UDP, TCP, etc. */
    AF_IMPLINK = 3          '/* arpanet imp addresses */
    AF_PUP = 4                '/* pup protocols: e.g. BSP */
    AF_CHAOS = 5            '/* mit CHAOS protocols */
    AF_NS = 6                  '/* XEROX NS protocols */
    AF_IPX = AF_NS          '/* IPX protocols: IPX, SPX, etc. */
    AF_ISO = 7                 '/* ISO protocols */
    AF_OSI = AF_ISO         '/* OSI is ISO */
    AF_ECMA = 8               '/* european computer manufacturers */
    AF_DATAKIT = 9          '/* datakit protocols */
    AF_CCITT = 10             '/* CCITT protocols, X.25 etc */
    AF_SNA = 11                '/* IBM SNA */
    AF_DECnet = 12           '/* DECnet */
    AF_DLI = 13                 '/* Direct data link interface */
    AF_LAT = 14                '/* LAT */
    AF_HYLINK = 15           '/* NSC Hyperchannel */
    AF_APPLETALK = 16     '/* AppleTalk */
    AF_NETBIOS = 17        '/* NetBios-style addresses */
    AF_VOICEVIEW = 18     '/* VoiceView */
    AF_FIREFOX = 19          '/* Protocols from Firefox */
    AF_UNKNOWN1 = 20    '/* Somebody is using this! */
    AF_BAN = 21               '/* Banyan */
    AF_ATM = 22               '/* Native ATM Services */
    AF_INET6 = 23             '/* Internetwork Version 6 */
    AF_CLUSTER = 24         '/* Microsoft Wolfpack */
    AF_12844 = 25             '/* IEEE 1284.4 WG AF */
    AF_MAX = 26

Socket types:
    SOCK_STREAM = 1       ' /* stream socket */
    SOCK_DGRAM = 2         ' /* datagram socket */
    SOCK_RAW = 3            ' /* raw-protocol interface */
    SOCK_RDM = 4             ' /* reliably-delivered message */
    SOCK_SEQPACKET = 5  ' /* sequenced packet stream */

Protocols:
    IPPROTO_IP = 0                '/* dummy for IP */
    IPPROTO_ICMP = 1            '/* control message protocol */
    IPPROTO_IGMP = 2            '/* internet group management protocol */
    IPPROTO_GGP = 3             '/* gateway^2 (deprecated) */
    IPPROTO_TCP = 6             '/* tcp */
    IPPROTO_PUP = 12           '/* pup */
    IPPROTO_UDP = 17           '/* user datagram protocol */
    IPPROTO_IDP = 22            '/* xns idp */
    IPPROTO_ND = 77             '/* UNOFFICIAL net disk proto */
    IPPROTO_RAW = 255        '/* raw IP packet */
    IPPROTO_MAX = 256


該函數(shù)可以建立使用特定協(xié)議的網(wǎng)絡(luò)套接字,,例如對于UDP協(xié)議可以這樣寫:
s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)



4.關(guān)閉Socket函數(shù)

Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long

函數(shù)有一個參數(shù)為建立socket時的Handle




5.連接函數(shù)

Declare Function connect Lib "ws2_32.dll" (ByVal s As Long, _
                                           ByRef name As sockaddr_in, _
                                           ByVal namelen As Long) As Long

參數(shù)

s             連接的socket句柄,。

name       建立連接的地址。

namelen    連接地址的長度,。

返回值

成功時返回0,。否則返回SOCKET_ERROR以及一個對應(yīng)的錯誤號 Err.LastDllError。

顯 然在調(diào)用這個函數(shù)時我們需要知道socket句柄,,將連接的電腦的端口號和主機(jī)名稱(或主機(jī)IP地址),。我們知道Winsock 控件的Connect方法依靠兩個變量:RemoteHost 和RemotePort。此方法不需要socket句柄,,因其已經(jīng)被封裝在COM對象中,。你也許認(rèn)為connect函數(shù)應(yīng)該也接受相同的變量設(shè)置,然而,, 事實并非如此,。connect函數(shù)的主機(jī)地址和端口號的傳送是依靠 sockaddr_in 結(jié)構(gòu),。

Public Type sockaddr_in
    sin_family       As Integer
    sin_port         As Integer
    sin_addr         As Long
    sin_zero(1 To 8) As Byte
End Type




6.套接字幫定函數(shù)

Declare Function bind Lib "ws2_32.dll" (ByVal s As Long, _
                  ByRef name As sockaddr_in, _
                  ByRef namelen As Long) As Long



s是使用Socket函數(shù)創(chuàng)建好的套接字,name指向描述通信對象的結(jié)構(gòu)體的指針,,namelen是該結(jié)構(gòu)的長度,。該結(jié)

構(gòu)體中的分量包括:
IP地址:對應(yīng)name.sin_addr.s_addr

端口號:對應(yīng)name.sin_port
        端口號用于表示同一臺計算機(jī)上不同的進(jìn)程(即應(yīng)用程序),其分配方法有兩種:
        第 一種分配方法是,,進(jìn)程讓系統(tǒng)為套接字自動分配一端口號,,這只要在調(diào)用bind前將端口號指定為0即可。由系統(tǒng)自動分配的端口號位于1024~5000之 間,,而1~1023之間的任一TCP或UDP端口都是保留的,,系統(tǒng)不允許任一進(jìn)程使用保留端口,除非其有效用戶ID是零(即超級用戶),。
        第二種分配方法是,,進(jìn)程為套接字指定一特定端口。這對于需要給套接字分配一眾所周知的端口的服務(wù)器是很有用的,。指定范圍在1024~65536之間,。

地址類型:對應(yīng)name.sin_family,一般都賦成AF_INET,,表示是internet地址(即IP 地址),。IP地址通常使用點分表示法表示,但它事實上一個32位的長整數(shù),,這兩者之間可通過inet_addr()函數(shù)轉(zhuǎn)換,。



7.套接字監(jiān)聽函數(shù)

Declare Function listen Lib "ws2_32.dll" (ByVal s As Long, ByVal backlog As Long) As Long

listen函數(shù)用來設(shè)定Socket為監(jiān)聽狀態(tài),這種狀態(tài)表明Socket準(zhǔn)備被連接了,。注意,,此函數(shù)一般在服務(wù)程序上使用,其中s是使用Socket函數(shù)創(chuàng)建好的套接字,,backlog參數(shù)用于設(shè)定等待連接的客戶端數(shù),。



8.接受連接請求

Declare Function accept Lib "ws2_32.dll" (ByVal s As Long, ByRef addr As sockaddr_in, _
                                          ByRef addrlen As Long) As Long


服務(wù)端應(yīng)用程序調(diào)用此函數(shù)來接受客戶端Socket連接請求,accept()函數(shù)的返回值為一新的Socket,,新Socket就可用來完成服務(wù)端和客戶端之間的信息傳遞與接收,,而原來Socket仍可以接受其他可戶端的連接請求。



9.接收信息

Declare Function recv Lib "ws2_32.dll" (ByVal s As Long, _
                                        ByRef buf As Any, _
                                        ByVal buflen As Long, _
                                        ByVal flags As Long) As Long


s    一個已連接的socket的識別符
buf   接受到的數(shù)據(jù)的緩沖區(qū)
len   緩沖區(qū)長度
flags 指定從哪調(diào)用的標(biāo)識

第一個參數(shù)是socket的句柄-為socket函數(shù)返回值,。那就是說:我們需要告訴recv函數(shù),,哪一個socket正訪問函數(shù)。

第 二個參數(shù)是:函數(shù)執(zhí)行之后能裝載一些數(shù)據(jù)的緩沖區(qū),。但它不是必須要有足夠的長度接收Winsock緩沖區(qū)的所有數(shù)據(jù),,緩沖區(qū)的大小限制為8192 字節(jié) (8 Kbytes)。因此如果Winsock緩沖區(qū)的數(shù)據(jù)的大小大于recv函數(shù)的緩沖區(qū),你必需多次調(diào)用此函數(shù),,直到獲取所有的數(shù)據(jù),。

如果應(yīng)用程序定義緩沖區(qū)的長度,則recv函數(shù)必須知道緩沖區(qū)可以存放多少字節(jié),。第三個參數(shù)就是為了這個目的,。

最后一個參數(shù)是可選的,今天我們不使用,。該參數(shù)有兩個選擇標(biāo)志: MSG_PEEK 和 MSG_OOB,,用于改變函數(shù)的行為。

MSG_PEEK 從輸入數(shù)據(jù)中取數(shù),。數(shù)據(jù)拷入緩沖區(qū),但不從輸入隊列中移走,。函數(shù)返回當(dāng)前準(zhǔn)備接收的字節(jié)數(shù),。  
MSG_OOB 處理OOB(Out-of-band帶外)數(shù)據(jù)。在網(wǎng)絡(luò)上有兩種類型的數(shù)據(jù)包,,正常包和帶外包,。帶外包可以通過檢驗一個TCP/IP包頭的一個特定標(biāo)志來決定。



10.發(fā)送信息

Declare Function send Lib "ws2_32.dll" (ByVal s As Long, _
                                        ByRef buf As Any, _
                                        ByVal buflen As Long, _
                                        ByVal flags As Long) As Long


參數(shù)參看接收信息

四,,服務(wù)器與客戶機(jī)交互

    目前最常用的方法是:服務(wù)程序在一個眾所周 知的地址(其中包括端口信息)監(jiān)聽對服務(wù)的請求,,也就是說,服務(wù)進(jìn)程一直處于休眠狀態(tài),,直到一個客戶對這個服務(wù)的地址提出了連接請求,。這個時刻,服務(wù)程序 被喚醒并對客戶的請求作出適當(dāng)?shù)姆磻?yīng),。注意,,服務(wù)器與客戶機(jī)之間的交互可以是面向連接的(基于流套接字),也可以是無連接的(基于數(shù)據(jù)報套接字),。


            服務(wù)器

           socket()
              |
            bind()
              |
           listen()                                       客戶機(jī)
              |
              |                                           socket()
              |                     建立連接               |
           accept()   <-------------------------    connect()
              |                     請求數(shù)據(jù)               |
            recv()   <-----------------------------     send()
              |                                                |
         處理服務(wù)請求                                    |
              |                      應(yīng)答數(shù)據(jù)              |
            send()    ------------------------------>   recv()
              |                                                |
           close()                                        close()




五,,其他

比較:WinSock控件
               優(yōu)點:使用簡單,工作量小,。
               缺點:功能少僅支持TCP,UDP協(xié)議,,需要WinSock控件(系統(tǒng)默認(rèn)安裝不帶MSWINSCK.OCX文件)
               適合于初學(xué)者
         WinSockAPI
               優(yōu)點:功能強(qiáng)大,支持多種協(xié)議,,使用靈活,,WinSockAPI調(diào)用的wsock32.dll(28K)或ws2_32.dll(69K)為Windows系統(tǒng)自帶函數(shù)庫不必?fù)?dān)心缺少文件。
               缺點:使用復(fù)雜,,編程量大,,需要一定基礎(chǔ)
               適合于要求較高的網(wǎng)絡(luò)程序

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多