CSocket,CAsyncSocket 中的虚函数详解及应用(一)

CAsyncSocket 中的虚函数

CAsyncSocket 是微软在MFC中将复杂的WinSock API函数集成封装的一个用于通讯的类,这种类的形式使得编写网络应用程序更容易。CSocket 是继承CAsyncSocket 的更高集成度的类。类中提供了几个用户可以自主操作的虚函数,合理地使用可以简化程序的难度。

CSocket 类中的虚函数的用法:

  1. 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保存供外部函数调用。

  2. virtual void OnClose( int nErrorCode );
    MSDN中的描述:Notifies a socket that the socket connected to it has closed.
    提醒Socket与之相连的Socket已经关闭,在调用Close方法后,对应的Socket会执行该函数。

  3. 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方法的返回值来判断。

  4. 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来传输这些数据。

  5. virtual void OnReceive( int nErrorCode );
    MSDN中的描述:Notifies a listening socket that there is data to be retrieved by calling Receive.
    提醒监听Socket有数据等待被接收,等待使用Receive方法来接收数据。一般当一方Socket调用Send操作后,另一方会自动运行该函数。

  6. virtual void OnSend( int nErrorCode );
    MSDN中的描述:Notifies a socket that it can send data by calling Send.
    提醒Socket可以发送消息。一般在双方连接成功后会自动调用。

一次完整的通讯过程如下图:
CSocket,CAsyncSocket 中的虚函数详解及应用(一)
关于整个过程的执行程序下次会给出简单的测试代码。