您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > VB网络编程--WinSock控件及WinSockAPI
VB网络编程--WinSock控件及WinSockAPI一,WinSock简介Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由SunMicrosystems,JSB,FTPsoftware,Microdyne和Microsoft等几家公司共同定制了一套标准,即WindowsSocket规范,简称WinSock。VB编写网络程序主要有两种方式:1.winsock控件2.winsockAPI二,WinSock控件的使用1.WinSock控件的主要属性a.Protocol属性通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。b.SocketHandle属性SocketHandle返回当前socket连接的句柄,这是只读属性。c.RemoteHostIP属性RemoteHostIP属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。d.ByteReceived属性返回当前接收缓冲区中的字节数e.State属性返回WinSock控件当前的状态常数值描述sckClosed0缺省值,关闭。SckOpen1打开。SckListening2侦听sckConnectionPending3连接挂起sckResolvingHost4识别主机。sckHostResolved5已识别主机sckConnecting6正在连接。sckConnected7已连接。sckClosing8同级人员正在关闭连接。sckError9错误2.WinSock主要方法a.Bind方法用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。b.Listen方法Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。c.Connect方法当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Connect方法调用的规范为:ConnectRemoteHost,RemotePortd.Accept方法当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。e.SendData方法当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。f.GetData方法当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。GetData方法调用规范如下:GetDatadata,[type,][maxLen]它从缓冲区中取得最长为maxLen的数据,并以type类型存放在data中,GetData取得数据后,就把相应的缓冲区清空。g.PeekData方法和GetData方法类似,但PeekData在取得数据后并不把缓冲区清空。3.Winsock控件主要事件a.ConnectRequest事件当本地计算机接收到远程计算机发送的连接请求时,控件的ConnectRequest事件将会被触发。b.SendProgress事件当一端的计算机正在向另一端的计算机发送数据时,SendProgress事件将被触发。SendProgress事件记录了当前状态下已发送的字节数和剩余字节数。c.SendComplete事件当所有数据发送完成时,被触发。d.DataArrival事件当建立连接后,接受到了新数据就会触发这个事件。注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。e.Error事件当在工作中发生任何错误都会触发这个事件。例子见附件三,WinSockAPI的使用1.WSAStartup函数为了在你的应用程序当中调用任何一个WinsockAPI函数,首先第一件事情你就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。DeclareFunctionWSAStartupLibws2_32.dll_(ByValwVersionRequiredAsLong,lpWSADataAsWSAData)AsLong这个函数有两个参数:wVersionRequired和lpWSAData。wVersionRequired参数定义WindowsSockets提供能使用的最高版本,它的高位字节定义的是次版本号,低位字节定义的是主版本号。下面的2个Winsock版本在VB中使用的例子:初始化1.1版本lngRetVal=WSAStartup(&H101,udtWinsockData)初始化2.2版本lngRetVal=WSAStartup(&H202,udtWinsockData)第二个参数是WSADATA的数据结构,它是接收WindowsSockets执行时的数据。TypeWSADatawVersionAsIntegerwHighVersionAsIntegerszDescriptionAsString*WSADESCRIPTION_LENszSystemStatusAsString*WSASYS_STATUS_LENiMaxSocketsAsIntegeriMaxUdpDgAsIntegerlpVendorInfoAsLongEndType数据成员的描述在下表中:Field描述wVersionWindowsSockets版本信息。wHighVersion通过加载库文件得到的最高的支持Winsock的版本,它通常和wVersion值相同。szDescriptionWindowsSockets执行时的详细描述szSystemStatus包含了相关的状态和配置的信息iMaxSockets表示同时打开的socket最大数,为0表示没有限制。iMaxUdpDg表示同时打开的数据报最大数,为0表示没有限制。lpVendorInfo厂商指定信息预留在Winsock的1.1和2.2版本中没有lpVendorInfo的返回值。因为winsock2支持多个传输协议,所以iMaxSockets和iMaxUdpDg只能在仅支持TCP/TP的winsock1.1中使用。为了在Winsock2中获得这些值,你可以使用WSAEnumProtocols函数。如果成功或者返回一个错误代码,则函数返回0。错误代码含义WSASYSNOTREADY指出网络没有为传输准备好。WSAVERNOTSUPPORTED当前的WinSock实现不支持应用程序指定的WindowsSockets规范版本WSAEINPROGRESS一个阻塞WinSock调用正在进行WSAEPROCLIM请求的协议没有在系统中配置或没有支持它的实现存在。WSAEFAULTlpWSAData不是有效的指针2.WSACleanup函数每次调用了WSAStartup函数,你都需要调用WSACleanup函数,通知系统来卸载库文件及清除已分配的资源,这个函数十分简单,没有任何参数:DeclareFunctionWSACleanupLibws2_32.dll()AsLong3.建立Socket函数DeclareFunctionsocketLibws2_32.dll(ByValafAsLong,_ByVals_typeAsLong,ByValProtocolAsLong)AsLong函数有3个参数定义建立何种socket,三个参数分别是:ArgumentDescriptionEnumTypeafAddressfamilyspecification.AddressFamilys_typeTypespecificationforthenewsocket.SocketTypeProtocolProtocoltobeusedwiththesocketSocketProtocolthatisspecifictotheindicatedaddressfamily.AddressFamily:AF_UNSPEC=0'/*unspecified*/AF_UNIX=1'/*localtohost(pipes,portals)*/AF_INET=2'/*internetwork:UDP,TCP,etc.*/AF_IMPLINK=3'/*arpanetimpaddresses*/AF_PUP=4'/*pupprotocols:e.g.BSP*/AF_CHAOS=5'/*mitCHAOSprotocols*/AF_NS=6'/*XEROXNSprotocols*/AF_IPX=AF_NS'/*IPXprotocols:IPX,SPX,etc.*/AF_ISO=7'/*ISOprotocols*/AF_OSI=AF_ISO'/*OSIisISO*/AF_ECMA=8'/*europeancomputermanufacturers*/AF_DATAKIT=9'/*datakitprotocols*/AF_CCITT=10'/*CCITTprotocols,X.25etc*/AF_SNA=11'/*IBMSNA*/AF_DECnet=12'/*DECnet*/AF_DLI=13'/*Directdatalinkinterface*/AF_LAT=14'/*LAT*/AF_HYLINK=15'/*NSCHyperchannel*/AF_APPLETALK=16'/*AppleTalk*/AF_NETBIOS=17'/*NetBios-styleaddresses*/AF_VOICEVIEW=18'/*VoiceView*/AF_FIREFOX=19'/*ProtocolsfromFirefox*/AF_UNKNOWN1=20'/*Somebodyisusingthis!*/AF_BAN=21'/*Banyan*/AF_ATM=22'/*NativeATMServices*/AF_INET6=23'/*InternetworkVersion6*/AF_CLUSTER=24'/*MicrosoftWolfpack*/AF_12844=25'/*IEEE1284.4WGAF*/AF_MAX=26Sockettypes:SOCK_STREAM=1'/*streamsocket*/SOCK_DGRAM=2'/*datagramsocket*/SOCK_RAW=3'/*raw-protocolinterface*/SOCK_RDM=4'/*reliably-deliveredmessage*/SOCK_SEQPACKET=5'/*sequencedpacketstream*/Protocols:IPPROTO_IP=0'/*dummyforIP*/IPPROTO_ICMP=1'/*controlmessageprotocol*/IPPROTO_IGMP=2'/*internetgroupmanagementprotocol*/IPPROTO_GGP=3'/*gateway^2(deprecated)*/IPPROTO_TCP=6'/*tcp*/IPPROTO_PUP=12'/*pup*/IPPROTO_UDP=17'/*userdatagramprotocol*/IPPROTO_IDP=22'/*xnsidp*/IPPROTO_ND=77'/*UNOFFICIALnetdiskproto*/IPPROTO_RAW=255'/*rawIPpac
本文标题:VB网络编程--WinSock控件及WinSockAPI
链接地址:https://www.777doc.com/doc-4286371 .html