CSocket是對CAsyncSocket的1個再次封裝,它將CAsyncSocket這類異步不阻塞的socket封裝成了同步阻塞的socket。它的實現原理其實很簡單,我們應當留意到在CAsyncSocket中Accept、Send、Receive函數被定義成了虛函數:
virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NULL );
virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );
virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0 );
CSocket就是通過繼承上述3個虛函數,在函數內部獲得先調用WSAGetLastError獲得毛病,如果毛病為WSAEWOULDBLOCK,說明IO操作未能完成,此時,它將進入消息循環,知道等到該IO事件完成為止。如果用偽代碼,表示以下:
BOOL CSocket::Accept(…) { CAsyncSocket:: Accept(…) { if(WSAGetLastError()==WSAEWOULDBLOCK) { while(True) { MSG msg; if(PeekMessage(&msg,WM_SOCKET_NOTIFY)) { if(msg.message== WM_SOCKET_NOTIFY) { … break; } } } } … } … } … }
其實對使用者來說使用CAsyncSocket和CSocket基本的編程步驟都是1致的,不同的只是它們二者之間的內部的處理邏輯。比如在上1文中,我們自定義了1個CMySocket類繼承自CAsyncSocket,而如果我想要使用CSocket類,只需將上1文中的CMySocket父類改成CSocket:
class CMySocket : public CSocket { … }
其他代碼不需要任何的改動,我們就可以得到功能相同的服務端和客戶端。
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本項目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
獲得本文源代碼:
git checkout NL58
上一篇 微信小程序上手篇(2)