對CSocket及其執行機制有了較深的理解

2021-03-31 08:56:59 字數 1932 閱讀 5405

客戶端與服務端的通訊簡單來講:服務端socket負責監聽,應答,接收和傳送訊息,而客戶端socket只是連線,應答,接收,傳送訊息。

1. 對於accept的block(阻塞)機制有了一定了解,呼叫服務端socket的accept後,跟蹤至原始碼:

while(!accept(...))

乙個看似死迴圈的無數次呼叫socket的api函式:accept, accept將檢查pending connection(來自client端的正在處理的連線)佇列,直到檢查到乙個正確的

pending connection。訊息幫浦函式pumpmessage將保證socket中的事件不會發生阻塞,這裡至少保證所偵聽的fd_accept事件不會阻塞。

2. 實戰之典型問題:客戶端socket要求與服務端的socket連線時,服務端的socket為什麼會進入onaccept訊息函式?

socket建立時,根據socket的描述字,將socket分配和繫結至相應的傳輸服務**者(個人認為應該是windows作業系統的網路傳輸服務程序),socket利用網路傳輸服務程序便可獲取來自某個ip位址(客戶端)的連線請求事件,然後是提供對訊息的接收和傳送等其它事件。

下面進入正題,把斷點設到casyncsocket::attachhandle開始處:

socket在建立時還呼叫casyncsocket::attachhandle(socket hsocket, casyncsocket* psocket, bool bdead)(csocket從casyncsocket派生),將socket例項句

柄和socket指標新增至當前模組狀態(注1)的乙個對映表變數m_pmapsockethandle中。

接著,在attachhandle過程中,會new乙個csocketwnd例項 - 你可以理解它是存放所有sockets的訊息池(基於window訊息),請仔細檢視,我這裡將將sockect後多加了乙個s,表示建立的多個socket將共享乙個訊息池csocketwnd。

當客戶端socket要求與服務端的socket連線時, 此時socket將相應的事件通知訊息wm_socket_notify傳送給csocketwnd。你可能會問socket怎麼發通告訊息給csocketwnd呢,我可要先知道csocketwnd的指標啊?答案是該指標(實際是視窗控制代碼)已儲存在當前執行緒狀態的m_hsocketwindow變數中, 取之!

有點奇怪的**?csocketwnd類是作為csocket類的友元類,這意味著它可以訪問csocket類中的保護和私有成員函式和變數,auxqueueadd和processauxqueue是

csocket類的靜態成員函式,明白了吧!還不明白?找本c++書看一下友元的使用方法吧!

ps: 訊息引數wparam是socket的控制代碼,lparam是socket的事件。

ok!暈了吧,真的我都有點暈了,但還沒完啊,let's go on!

processauxqueue是實質處理socket通告訊息的函式,在該函式中有這樣一句**:

casyncsocket* psocket = casyncsocket::lookuphandle((socket)wparam, true);

其實也就是由socket控制代碼得到傳送事件通知訊息的socket指標psocket:從m_pmapsockethandle中查詢!

最後,wsagetselectevent(lparam)會取出事件型別,在乙個簡單的switch語句中判斷事件型別並呼叫事件處理函式。

在這裡,事件型別是fd_accept,當然就呼叫psocket->onaccept了!

注:

1. 當前模組狀態:用於儲存當前執行緒和模組狀態的乙個結構,可以通過afxgetthreadmodule()獲得。afx_module_thread_state在csocket重新定義為_afx_sock_thread_state。

session執行機制

session機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表 的結構 也可能就是使用 雜湊表 來儲存資訊。當程式需要為某個客戶端的請求建立乙個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了乙個session標識 稱為sessionid,如果已包含乙個sessionid則說明...

try catch finally執行機制

finally的執行 如下的程式所示,注釋中是執行的順序 public class test public static string test finally public static string test1 finally其實是僅在return 語句執行前執行,如果return 乙個函式,那...

runtime執行機制

這篇文章主要介紹的是runtime是什麼以及怎麼用!希望對讀者有所幫助!第乙個問題,1 runtime實現的機制是什麼,怎麼用,一般用於幹嘛?runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api。在我們平時編寫的oc 中,程式執行過程時,其實最終都是轉成了ru...