非阻塞模式

非阻塞模式是指利用socket事件的訊息機制,Server端與Client端之間的通信處於異步狀態。

非阻塞模式

在非阻塞模式下利用socket事件的訊息機制,Server端與Client端之間的通信處於異步狀態下。

通常需要從CSocket類派生一個新類,派生新類的目的是重載socket事件的訊息函式,然後在socket事件的訊息函式中添入合適的代碼以完成Client端與Server端之間的通信,與阻塞模式相比,非阻塞模式無需創建一個新執行緒。

這裡將討論當Server端socket事件-FD_ACCEPT被觸發後,該事件的處理函式OnAccept是如何進一步被觸發的。其它事件的處理函式如OnConnect,OnReceive等的觸發方式與此類似。

在1中已提到Client/Server端通信時,Server端socket正在接收來自Client端socket連線請求,這將會觸發FD_ACCEPT事件,同時Server端的網路傳輸服務進程向Server端的socketwindow(CSocketWnd)傳送事件通知訊息WM_SOCKET_NOTIFY,通知有FD_ACCEPT事件產生,CsocketWnd在收到事件通知訊息後,調用訊息處理函式OnSocketNotify:

LRESULTCSocketWnd::OnSocketNotify(WPARAMwParam,LPARAMlParam)
{
CSocket::AuxQueueAdd(WM_SOCKET_NOTIFY,wParam,lParam);
CSocket::ProcessAuxQueue();
return0L;
}
訊息參數wParam是socket的句柄,lParam是socket事件。這裡稍作解釋一下,CSocketWnd類是作為CSocket類的友元類,這意味著它可以訪問CSocket類中的保護和私有成員函式和變數,AuxQueueAdd和ProcessAuxQueue是CSocket類的靜態成員函式,如果你對友元不熟悉,請迅速找本有關C 書看一下友元的使用方法吧!

ProcessAuxQueue是實質處理socket事件的函式,在該函式中有這樣一句代碼:

CAsyncSocket*pSocket=CAsyncSocket::LookupHandle((SOCKET)wParam,TRUE);
其實也就是由socket句柄得到傳送事件通知訊息的socket指針pSocket:從m_pmapSocketHandle中查找(見1)!

最後,WSAGETSELECTEVENT(lParam)會取出事件類型,在一個簡單的switch語句中判斷事件類型並調用事件處理函式。在這裡,事件類型是FD_ACCEPT,當然就調用pSocket->OnAccept!

結束語

Server端socket處於阻塞調用模式下,它必須在一個新創建的執行緒中工作,防止主執行緒被阻塞。

當有多個Client端socket與Server端socket連線及通信時,Server端採用阻塞模式就顯得不適合了,應該採用非阻塞模式,利用socket事件的訊息機制來接受多個Client端socket的連線請求並進行通信。

在非阻塞模式下,利用CSocketWnd作為所有sockets的訊息池,是實現socket事件的訊息機制的關鍵技術。文中存在用詞不妥和可能存在的技術問題,請大家原諒,也請批評指正,謝謝!

註:

當前模組狀態——用於保存當前執行緒和模組狀態的一個結構,可以通過AfxGetThreadModule()獲得。AFX_MODULE_THREAD_STATE在CSocket重新定義為_AFX_SOCK_THREAD_STATE。
socket類型——在TCP/IP協定中,Client/Server網路程式採用TCP協定:即socket類型為SOCK_STREAM,它是可靠的連線方式。在這裡不採用UDP協定:即socket類型為SOCK_DGRAM,它是不可靠的連線方式。
原始碼參考:

http://www.codeproject.com/internet/SocketFileTransfer.asp採用CSocket類編寫的基於Client/Server的網路檔案傳輸程式,它是基於阻塞模式的Client/Server端網路程式典型示例
http://www.codeguru.com/Cpp/I-N/network/messaging/article.php/c5453採用CSocket類編寫的基於Client/Server的網路聊天程式,它是基於非阻塞模式的Client/Server端網路程式典型示例。
參考資料

MicrosoftMSDNLibrary–January2001
Windows網路編程清華大學出版社

相關詞條

相關搜尋

熱門詞條

聯絡我們