非阻塞模式

2021-07-11 11:17:37 字數 1662 閱讀 4463

非阻塞模式是指利用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)編輯

訊息引數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,它是不可靠的連線方式。

阻塞模式和非阻塞模式

好文得轉 何為阻塞?在以上過程中若連線還沒到來,那麼 accept 會阻塞 程式執行到這裡不得不掛起,cpu 轉而執行其他執行緒。在以上過程中若資料還沒準備好,read 會一樣也會阻塞。阻塞式網路 io 的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些 cpu 時間。每個執行緒遇...

Socket 阻塞模式和非阻塞模式

阻塞i o模型 簡介 程序會 一直阻塞 直到資料拷貝 完成 應用程式呼叫乙個io函式,導致應用程式阻塞,等待資料準備好。如果資料沒有準備好,一直等待 資料準備好了,從核心拷貝到使用者空間,io函式返回成功指示。阻塞i o模型圖 在呼叫recv recvfrom 函式時,發生在核心中等待資料和複製資料...

Socket 阻塞與非阻塞模式

阻塞模式 windows套接字在阻塞和非阻塞兩種模式下執行i o操作。在阻塞模式下,在i o操作完成前,執行的操作函式一直等候而不會立即返回,該函式所在的執行緒會阻塞在這裡。相反,在非阻塞模式下,套接字函式會立即返回,而不管i o是否完成,該函式所在的執行緒會繼續執行。在阻塞模式的套接字上,呼叫任何...