为了降低网络程序开发的难度,提高程序开发效率,MFC对套接字函数进行了封装,提供了CAsyncSocket类和CSocket类用于网络程序开发。
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)
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 表示套接字能够处理的网络事件,其值可以是表20.18描述的任意值的组合
lpszSocketAddress 表示套接字的IP地址
nSocketType表示套接字的类型,如果为SOCK_STREAM,表示流式套接字;为SOCK_DGRAM,表示数据包套接字
lEvent 表示套接字能够处理的网络事件,其值可以是表20.18描述的任意值的组合
lpszSocketAddress 表示套接字的IP地址
FD_READ 当套接字中有数据需要读取时触发事件
FD_WRITE 当向套接字写入数据时触发事件
FD_OOB 当接收到带外数据时触发事件
FD_ACCEPT 当接收到连接请求时触发事件
FD_CONNECT 当连接完成时触发事件
FD_CLOSE 当套接字关闭时触发事件
(2)GetLastError方法
该方法用于获取最后一次操作失败的状态信息。
语法:
static int GetLastError( );
返回值:返回错误编号。
(3)GetPeerName方法
该方法用于获取套接字连接的IP地址信息。
语法:
BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );
BOOL GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen );
FD_WRITE 当向套接字写入数据时触发事件
FD_OOB 当接收到带外数据时触发事件
FD_ACCEPT 当接收到连接请求时触发事件
FD_CONNECT 当连接完成时触发事件
FD_CLOSE 当套接字关闭时触发事件
(2)GetLastError方法
该方法用于获取最后一次操作失败的状态信息。
语法:
static int 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 );
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 );
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 );
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 );
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 表示函数调用方式
nBufLen 表示缓冲区大小
nHostPort 表示主机端口号
lpszHostAddress 表示主机地址
lpSockAddr 表示一个sockaddr结构指针,用于确定主机套接字地址信息
lpSockAddrLen 确定lpSockAddr的大小
nFlags 表示函数调用方式
(13)ShutDown方法
该方法用于在套接字上断开数据的发送或接收。
语法:
BOOL ShutDown( int nHow = sends );
其中,nHow用于确定ShutDown函数的行为,0表示不允许接收,1表示不允许发送,2表示不允许接收和发送。
该方法用于在套接字上断开数据的发送或接收。
语法:
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表示错误代码。
当套接字接受连接请求时触发该事件。
语法:
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表示错误代码。
版权声明: