CAsyncSocket类
CAsyncSocket类对套接字函数进行了简单封装,它提供了基于事件的I/O异步模型,使得用户可以方便地处理接收和发送等事件。但是,用户需要自己处理网络的字节顺序问题、不同字符集间的转换问题等。CAsyncSocket类的主要方法、事件如下:
(1)Create方法
该方法用于创建一个Windows套接字,并将其附加到CAsyncSocket类对象上。
语法:
BOOL Create(UINT nSocketPort = 0,int nSocketType = SOCK_STREAM,long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddress = NULL)
参数说明:
nSocketPort:表示套接字端口,如果为0,系统将自动选择一个端口。
nSocketType:表示套接字的类型,如果为SOCK_STREAM,表示流式套接字,为SOCK_DGRAM,表示数据包套接字。
lEvent:表示套接字能够处理的网络事件,其值可以是表1描述的任意值的组合。
表1 套接字网络事件
|
值
|
描述
|
|
FD_READ
|
当套接字中有数据需要读取时触发事件
|
|
FD_WRITE
|
当向套接字写入数据时触发事件
|
|
FD_OOB
|
当接收到外带数据时触发事件
|
|
FD_ACCEPT
|
当接收到连接请求时触发事件
|
|
FD_CONNECT
|
当连接完成时触发事件
|
|
FD_CLOSE
|
当套接字关闭时触发事件
|
lpszSocketAddress:表示套接字的IP地址。
(2)GetLastError方法
该方法用于获取最后一次操作失败的状态信息。
语法:
static int GetLastError( );
提示:我们在进行网络操作时,如果某一项操作失败,想要了解错误原因,可以调用GetLastError方法获取错误代码。
(3)GetPeerName方法
该方法用于获取套接字连接的IP地址信息。
语法:
BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );
BOOL GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen );
参数说明:
rPeerAddress:用于接收函数返回的IP地址。
rPeerPort:用于记录端口号。
lpSockAddr:是一个sockaddr结构指针,用于记录套接字名称。
lpSockAddrLen:用于确定lpSockAddr的大小。
(4)Accept方法
该方法用于接受客户端的连接。
语法:
virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NULL );
参数说明:
rConnectedSocket:表示对应当前连接的套接字引用。
lpSockAddr:表示一个sockaddr结构指针,用于记录套接字地址。
lpSockAddrLen:确定lpSockAddr的大小。
(5)Bind方法
该方法用于将IP地址和端口号绑定到套接字上。
语法:
BOOL Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL );
BOOL Bind ( const SOCKADDR* lpSockAddr, int nSockAddrLen );
参数说明:
nSocketPort:表示套接字端口。
lpszSocketAddress:表示IP地址。
lpSockAddr:表示一个sockaddr结构指针,该结构记录了套接字的地址信息。
nSockAddrLen:确定lpSockAddr的大小。
(6)Connect方法
该方法用于发送一个连接请求。
语法:
BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort );
BOOL Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen );
参数说明:
lpszHostAddress:表示主机的IP地址或网址。
nHostPort:表示主机的端口。
lpSockAddr:是一个sockaddr结构指针,该结构标识套接字地址信息。
nSockAddrLen:确定lpSockAddr的大小。
(7)Close方法
该方法用于关闭套接字。
语法:
virtual void Close( );
(8)Listen方法
该方法用于将套接字置于监听模式。
语法:
BOOL Listen( int nConnectionBacklog = 5 );
参数说明:
nConnectionBacklog:表示等待连接的最大队列长度。
(9)Receive方法
该方法用于在流式套接字中接收数据。
语法:
virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );
参数说明:
lpBuf:表示接收数据的缓冲区。
nBufLen:确定缓冲区的长度。
nFlags:确定函数的调用模式,为MSG_PEEK,表示用来查看传来的数据,在序列前端的数据会被复制一份到返回缓冲区中,但是这个数据不会从序列中移走。为MSG_OOB,表示处理外带数据。
(10)ReceiveFrom方法
该方法用于从数据包套接字中接收数据。
语法:
int ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 );
int ReceiveFrom( void* lpBuf, int nBufLen, SOCKADDR* lpSockAddr, int* lpSockAddrLen, int nFlags = 0 );
参数说明:
lpBuf:表示接收数据的缓冲区。
nBufLen:表示缓冲区的大小。
rSocketAddress:用于接收数据报的目的地(IP地址)。
rSocketPort:用于记录端口号。
lpSockAddr:是一个sockaddr结构指针,用于记录套接字地址信息。
lpSockAddrLen:确定lpSockAddr的大小。
nFlags:确定函数的调用模式,为MSG_PEEK,表示用来查看传来的数据,在序列前端的数据会被复制一份到返回缓冲区中,但是这个数据不会从序列中移走。为MSG_OOB,表示处理外带数据。
(11)Send方法
该方法用于向流式套接字中发送数据。
语法:
virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0 );
参数说明:
lpBuf:表示要发送数据的缓冲区。
nBufLen:确定缓冲区的大小。
nFlags:表示函数调用方法。
(12)SendTo方法
该方法用于在流式套接字或数据包套接字上发送数据。
语法:
int SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress=NULL, int nFlags = 0 );
int SendTo( const void* lpBuf, int nBufLen, const SOCKADDR* lpSockAddr, int nSockAddrLen, int nFlags = 0 );
参数说明:
lpBuf:表示要发送数据的缓冲区。
nBufLen:表示缓冲区大小。
nHostPort:表示主机端口号。
lpszHostAddress:表示主机地址。
lpSockAddr:表示一个sockaddr结构指针,用于确定主机套接字地址信息。
lpSockAddrLen:确定lpSockAddr的大小。
nFlags:表示函数调用方式。
(13)ShutDown方法
该方法用于在套接字上断开数据的发送或接收。
语法:
BOOL ShutDown( int nHow = sends );
参数说明:
nHow:确定ShutDown函数的行为,0表示不允许接收,1表示不允许发送,2表示不允许接受和发送。
(14)OnAccept事件
当套接字接受连接请求时触发该事件。
语法:
virtual void OnAccept( int nErrorCode );
参数说明:
nErrorCode:表示错误代码。
(15)OnClose事件
当套接字关闭时触发该事件。
语法:
virtual void OnClose( int nErrorCode );
参数说明:
nErrorCode:表示错误代码。
(16)OnConnect事件
当套接字连接之后触发该事件。
语法:
virtual void OnConnect( int nErrorCode);
参数说明:
nErrorCode:表示错误代码。
(17)OnReceive事件
当套接字上有数据被接收时触发该事件。
语法:
virtual void OnReceive( int nErrorCode );
参数说明:
nErrorCode:表示错误代码。
(18)OnSend事件
当套接字发送数据时触发该事件。
语法:
virtual void OnSend( int nErrorCode);
参数说明:
nErrorCode:表示错误代码。