| 18.4 | WinSock类
在Visual C++的MFC类库中,提供了两个与WinSock相关的类,分别为CAsyncSocket类和CSocket类。这两个类对WinSock API进行了封装,使得开发Windows Socket应用程序变得简单了。本节将针对CAsyncSocket和CSocket介绍Windows Socket应用程序的开发。
18.4.1 CAsyncSocket类介绍
CAsyncSocket类对WinSock API进行了低级封装,它提供的许多方法直接对应于低层的API函数。在使用CAsyncSocket时,首先需要调用构造函数创建CAsyncSocket对象,然后调用Create方法创建套接字句柄,对于服务器端的套接字,需要调用Listen方法使其处于监听模式,对于客户端套接字,需要调用Connect方法连接服务器。下面介绍CAsyncSocket的主要方法和事件。
(1)Create方法
Create方法用于创建一个Windows 套接字。
语法:
Create方法用于创建一个Windows 套接字。
语法:
Create方法参数说明如表18.9所示。
表18.9 Create方法参数说明
参 数 名 称 参 数 描 述
nSocketPort 标识套接字端口
nSocketType 标识套接字类型,默认为流式套接字
lEvent 表示套接字能够接受的事件
lpszSocketAddress 表示套接字的网络地址
表18.9 Create方法参数说明
参 数 名 称 参 数 描 述
nSocketPort 标识套接字端口
nSocketType 标识套接字类型,默认为流式套接字
lEvent 表示套接字能够接受的事件
lpszSocketAddress 表示套接字的网络地址
(2)GetLastError方法
GetLastError方法用于获得最后一次操作失败的状态信息。
语法:
GetLastError方法用于获得最后一次操作失败的状态信息。
语法:
(3)GetPeerName方法
GetPeerName方法用于获得套接字连接的IP地址。
语法:
GetPeerName方法用于获得套接字连接的IP地址。
语法:
GetPeerName方法参数说明如表18.10所示。
表18.10 GetPeerName方法参数说明
参 数 名 称 参 数 描 述
rPeerAddress 用于接收函数返回的IP地址
rPeerPort 用于记录端口号
lpSockAddr 是一个sockaddr结构指针,用于记录套接字名称
lpSockAddrLen 用于确定lpSockAddr的大小
(4)Accept方法
Accept方法用于接受一个套接字的连接。
语法:
Accept方法用于接受一个套接字的连接。
语法:
rConnectedSocket:当前连接的套接字引用。
lpSockAddr:一个SOCKADDR结构指针,用于记录套接字地址。
lpSockAddrLen:确定lpSockAddr的大小。
lpSockAddr:一个SOCKADDR结构指针,用于记录套接字地址。
lpSockAddrLen:确定lpSockAddr的大小。
(5)Bind方法
Bind方法将本机地址关联到套接字上。
语法:
Bind方法将本机地址关联到套接字上。
语法:
Bind方法参数说明如表18.11所示。
表18.11 Bind方法参数说明
参 数 名 称 参 数 描 述
nSocketPort 标识套接字端口
lpszSocketAddress 标识IP地址
lpSockAddr 是一个SOCKADDR结构指针,该结构记录了套接字的地址信息
nSockAddrLen 确定lpSockAddr的大小
表18.11 Bind方法参数说明
参 数 名 称 参 数 描 述
nSocketPort 标识套接字端口
lpszSocketAddress 标识IP地址
lpSockAddr 是一个SOCKADDR结构指针,该结构记录了套接字的地址信息
nSockAddrLen 确定lpSockAddr的大小
(6)Close方法
Close方法用于关闭套接字。
语法:
Close方法用于关闭套接字。
语法:
说明:
Close方法释放套接字描述符,因此,在调用该方法后,再对其进行访问,会导致错误。当CAsyncSocket对象被释放时,会自动调用Close方法。
Close方法释放套接字描述符,因此,在调用该方法后,再对其进行访问,会导致错误。当CAsyncSocket对象被释放时,会自动调用Close方法。
(7)Connect方法
Connect方法用于建立一个套接字连接。
语法:
Connect方法用于建立一个套接字连接。
语法:
Connect方法参数说明如表18.12所示。
表18.12 Connect方法参数说明
参 数 名 称 参 数 描 述
lpszHostAddress 是主机的IP地址或网址
nHostPort 标识当前应用程序的端口
lpSockAddr 是一个SOCKADDR结构指针,该结构标识套接字地址信息
nSockAddrLen 确定lpSockAddr的大小
表18.12 Connect方法参数说明
参 数 名 称 参 数 描 述
lpszHostAddress 是主机的IP地址或网址
nHostPort 标识当前应用程序的端口
lpSockAddr 是一个SOCKADDR结构指针,该结构标识套接字地址信息
nSockAddrLen 确定lpSockAddr的大小
(8)Listen方法
Listen方法用于监听套接字的连接请求。
语法:
Listen方法用于监听套接字的连接请求。
语法:
nConnectionBacklog:表示等待连接的最大队列长度。
(9)Receive方法
Receive方法用于从一个套接字上接收数据。
语法:
Receive方法用于从一个套接字上接收数据。
语法:
lpBuf:是接收数据的缓冲区。
nBufLen:确定缓冲区的长度。
nFlags:确定函数的调用模式,可选值如下。
l MSG_PEEK用来查看传来的数据,在序列前端的数据会被复制一份到返回缓冲区中,但是这个数据不会从序列中移走。
l MSG_OOB用来处理Out-Of-Band数据。
(10)ReceiveFrom方法
ReceiveFrom方法用于接收面向无连接传递的数据(数据报)。
语法:
ReceiveFrom方法用于接收面向无连接传递的数据(数据报)。
语法:
ReceiveFrom方法参数说明如表18.13所示。
表18.13 ReceiveFrom方法参数说明
参 数 名 称 参 数 描 述
lpBuf 是接收数据的缓冲区
nBufLen 是缓冲区的大小
rSocketAddress 用于接收数据报的目的地(IP地址)
rSocketPort 用于记录端口号
lpSockAddr 是一个SOCKADDR结构指针,用于记录套接字地址信息
lpSockAddrLen 确定lpSockAddr的大小
nFlags 标识函数调用方式
表18.13 ReceiveFrom方法参数说明
参 数 名 称 参 数 描 述
lpBuf 是接收数据的缓冲区
nBufLen 是缓冲区的大小
rSocketAddress 用于接收数据报的目的地(IP地址)
rSocketPort 用于记录端口号
lpSockAddr 是一个SOCKADDR结构指针,用于记录套接字地址信息
lpSockAddrLen 确定lpSockAddr的大小
nFlags 标识函数调用方式
(11)Send方法
Send方法用于发送数据到连接的套接字上。
语法:
Send方法用于发送数据到连接的套接字上。
语法:
lpBuf:标识要发送数据的缓冲区。
nBufLen:确定缓冲区的大小。
nFlags:标识函数调用方法。
(12)SendTo方法
SendTo方法既可以在面向连接的套接字上发送数据,也可以在面向无连接的套接字上发送数据。
语法:
SendTo方法既可以在面向连接的套接字上发送数据,也可以在面向无连接的套接字上发送数据。
语法:
SendTo方法参数说明如表18.14所示。
表18.14 SendTo方法参数说明
参 数 名 称 参 数 描 述
lpBuf 标识要发送数据的缓冲区
nBufLen 确定缓冲区大小
nHostPort 确定主机端口号
lpszHostAddress 确定主机地址(可以是域名或IP地址)
lpSockAddr 是一个SOCKADDR结构指针,用于确定主机套接字地址信息
nSockAddrLen 确定lpSockAddr的大小
nFlags 标识函数调用方式
表18.14 SendTo方法参数说明
参 数 名 称 参 数 描 述
lpBuf 标识要发送数据的缓冲区
nBufLen 确定缓冲区大小
nHostPort 确定主机端口号
lpszHostAddress 确定主机地址(可以是域名或IP地址)
lpSockAddr 是一个SOCKADDR结构指针,用于确定主机套接字地址信息
nSockAddrLen 确定lpSockAddr的大小
nFlags 标识函数调用方式
(13)ShutDown方法
ShutDown方法用于在套接字上断开数据的发送或接收。
语法:
ShutDown方法用于在套接字上断开数据的发送或接收。
语法:
nHow:确定ShutDown函数的行为,0表示不允许接收,1表示不允许发送,2表示不允许接收和发送。
(14)OnAccept事件
OnAccept事件在套接字接受连接请求时触发。
语法:
OnAccept事件在套接字接受连接请求时触发。
语法:
nErrorCode:标识错误代码。
(15)OnClose事件
OnClose事件在连接的套接字被关闭时触发。
语法:
OnClose事件在连接的套接字被关闭时触发。
语法:
nErrorCode:标识错误代码。
(16)OnConnect事件
OnConnect事件在套接字被连接后触发。
语法:
OnConnect事件在套接字被连接后触发。
语法:
nErrorCode:标识错误代码。
(17)OnOutOfBandData事件
OnOutOfBandData事件在接收数据的套接字收到Out-Of-Band数据时触发。
语法:
OnOutOfBandData事件在接收数据的套接字收到Out-Of-Band数据时触发。
语法:
nErrorCode:标识错误代码。
(18)OnReceive事件
OnReceive事件在套接字有数据被接收时触发。
语法:
OnReceive事件在套接字有数据被接收时触发。
语法:
nErrorCode:标识错误代码。
(19)OnSend事件
OnSend事件在套接字发送数据时触发。
语法:
OnSend事件在套接字发送数据时触发。
语法:
nErrorCode:标识错误代码。
转载于:https://blog.51cto.com/yizhiqiang/212545