呼叫iocp的步驟如下
抽象出乙個完成埠大概的處理流程:
1、建立乙個完成埠。
2、建立乙個執行緒a
3、a執行緒迴圈呼叫getqueuedcompletionstatus() 函式來得到i/o操作結果, 這個函式是阻塞函式
4、主線程迴圈裡呼叫accept等待客戶端連線上來。
5、主線程裡accept返回新連線建立以後,把這個新的套接字控制代碼用 createiocompletionport 關聯到完成埠,然後發出乙個非同步的wsasend 或者 wsarecv 呼叫。 因為是非同步函式,wsasend/wsarecv 會馬上返回, 實際的傳送或者接收資料的操作由windows系統去做。
6、主線程繼續下一次迴圈,阻塞在accept這裡等待客戶端連線。
7、windows 系統完成wsasend 或者wsarecv的操作, 把結果發到完成埠。
8、a執行緒裡的getqueuedcompletionstatus() 馬上返回,並從完成埠取得剛完成的wsasend/wsarecv的結果。
9、在a執行緒裡對這些資料進行處理(如果處理過程很耗時,需要新開執行緒處理),然後接著發出wsasend/wsarecv, 並繼續下一次迴圈阻塞在getqueuedcompletionstatues()這裡。
歸根姐弟概括完成埠模型一句話:
我們不停的發出非同步的wsasend/wsarecv i/o操作, 具體的io處理過程由windows系統完成,windows系統完成實際的io處理後,把結果送到完成埠上(如果有多個io都完成了,那麼就在完成埠那裡排成乙個佇列)。 我們在另乙個執行緒裡從完成埠不斷地取出io操作結果,然後根據需要再發出wsasend/wsarecv io操作
完成埠模型是怎麼實現的? 我們先建立乙個完成埠(::createiocompletioport() )。 然後再建立乙個或多個工作執行緒,並制定他們到這個完成埠上去讀取資料。 我們再將遠端連線的套接字控制代碼關聯到這個完成埠 (還是用::createiocompletionport())。 一切就ok了。
工作執行緒都幹些色狠麼那? 首先是呼叫::getqueuedcompletionstatus() 函式在關聯到這個完成埠上的所有套接字上等待i/o的完成。 再判斷完成了什麼型別的i/o。 一般來說,有三種型別的i/o, op_accept, op_read 和 op_write。 我們到資料緩衝區內讀取資料後,再投遞乙個或是多個同型別的i/o即可(::acceptex()、::wsarecv()、::wsasend() )。 對讀取到的資料,我們可以按照字集的需要來進行相應的處理
#define buffer_size 1024;
typedef struct _per_io_data
per_io_data, *pper_io_data;
這樣乙個iocp伺服器的框架就出來了。 當然,要做乙個好的iocp伺服器,還有考慮很多問題,如記憶體資源管理、接受連線的方法、惡意的客戶端連線、包的重排等等。
IOCP簡單實現
本人工作是服務端效能測試,因工作需要開發機械人框架,選用底層的時候看到網上滿大街的iocp介紹,還有說iocp比wsaasyncselect複雜等等,所以只好轉wsaasyncselect實現。因併發客戶端需要進行除錯測試,壓力測試工具作為客戶端來說效能十分重要,沒有經過測試的鬼知道秒併發多少請求,...
實現AJAX的基本步驟
實現ajax的基本步驟 一 建立xmlhttprequest物件 所有現代瀏覽器 ie7 firefox chrome safari 以及 opera 均支援xmlhttprequest 物件,而ie5 和 ie6 使用 的是activexobject。在現代瀏覽器中建立xmlhttprequest...
實現AJAX的基本步驟
要完整實現乙個ajax非同步呼叫和區域性重新整理,通常需要以下幾個步驟 1 建立xmlhttprequest物件,也就是建立乙個非同步呼叫物件.建立物件 2 為ajax引擎物件繫結監聽 監聽伺服器已將資料響應給引擎 繫結監聽物件 xhr.onreadystatechange function 3 配...