CSocket,CAsyncSocket 中的虚函数详解及应用(一)
CAsyncSocket 中的虚函数
CAsyncSocket 是微软在MFC中将复杂的WinSock API函数集成封装的一个用于通讯的类,这种类的形式使得编写网络应用程序更容易。CSocket 是继承CAsyncSocket 的更高集成度的类。类中提供了几个用户可以自主操作的虚函数,合理地使用可以简化程序的难度。
CSocket 类中的虚函数的用法:
-
virtual void OnAccept( int nErrorCode );
MSDN中的描述:Notifies a listening socket that it can accept pending connection requests by calling Accept.
提醒监听套接字可以接受正在等待连接的客户端套接字的请求,通过Accept函数。从描述中,该函数是在服务器收到客户端的连接请求后自动响应的函数,即当客户端Socket调用函数Connect向监听Socket发送连接请求,监听Socket会执行该函数。
该函数避免了在程序服务器必须一直监听是否有连接请求,是CSocket类中自动使用多线程技术,简化了许多步骤。
一般在该函数中调用CSocket 类中的Accept方法,生成一个Socket对象用于与对应的客户端进行通讯,还可以将该Socket保存供外部函数调用。 -
virtual void OnClose( int nErrorCode );
MSDN中的描述:Notifies a socket that the socket connected to it has closed.
提醒Socket与之相连的Socket已经关闭,在调用Close方法后,对应的Socket会执行该函数。 -
virtual void OnConnect( int nErrorCode );
MSDN中的描述:Notifies a connecting socket that the connection attempt is complete, whether successfully or in error.
当Socket连接完成后无论连接是否成功都会执行,属于CAsyncSocket类中才会调用的方法,CSocket不会对该虚函数进行响应,CSocket类中连接操作是否成功直接通过Connect方法的返回值来判断。 -
virtual void OnOutOfBandData ( int nErrorCode );
MSDN中的描述:Notifies a receiving socket that there is out-of-band data to be read on the socket, usually an urgent message.
提醒接收Scoket有带外数据需要被读取,通常是紧急消息。带外数据(Out-Of-Band,OOB)通常是一些重要的数据,TCP协议中提供了一种紧急模式(urgent mode)用来处理这些数据,具体可自己搜一下。MFC虽然支持OOB,但是不鼓励用户使用,一般可以用另一个Socket来传输这些数据。 -
virtual void OnReceive( int nErrorCode );
MSDN中的描述:Notifies a listening socket that there is data to be retrieved by calling Receive.
提醒监听Socket有数据等待被接收,等待使用Receive方法来接收数据。一般当一方Socket调用Send操作后,另一方会自动运行该函数。 -
virtual void OnSend( int nErrorCode );
MSDN中的描述:Notifies a socket that it can send data by calling Send.
提醒Socket可以发送消息。一般在双方连接成功后会自动调用。
一次完整的通讯过程如下图:
关于整个过程的执行程序下次会给出简单的测试代码。