客戶端與服務端的通訊簡單來講:服務端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...