Winsock 完成埠類分析(一)

2021-04-12 22:29:29 字數 1504 閱讀 6283

在windows

下進行網路服務端程式開發,毫無疑問,winsock 完成埠模型是最高效的。winsock的完成埠模型借助widnows的重疊io和完成埠來實現,完成埠模型懂了之後是比較簡單的,但是要想掌握winsock完成埠模型,需要對windows下的執行緒、執行緒同步,winsock api以及windows io機制有一定的了解。如果不了解,推薦幾本書:《inside windows 2000,《windows核心程式設計》,《win32多執行緒程式設計》、《windows網路程式設計技術》。在去年,我在c語言下用完成埠模型寫了乙個web

server,前些天,我決定用c++

重寫這個webserver,給這個webserver增加了一些功能,並改進完成埠操作方法,比如採用acceptex來代替accept和使用lookaside list來管理記憶體,使得webserver的效能有了比較大的提高。

在重寫的開始,我決定把完成埠模型封裝成乙個比較通用的c++類,針對各種網路服務端程式的開發,只要簡單地繼承這個類,改寫其中兩個虛函式就能滿足各種需要。到昨天為止,webserver重寫完畢,我就寫了這篇文章對完成埠模型做乙個總結,並介紹一下我的這個類。

一:完成埠模型

至於完成埠和winsock完成埠模型的詳細介紹,請參見我上面介紹的那幾本書,這裡只是我個人對完成埠模型理解的一點心得。

首先我們要抽象出乙個完成埠大概的處理流程:

1:建立乙個完成埠。

2:建立乙個執行緒a。

3:a執行緒迴圈呼叫getqueuedcompletionstatus()函式來得到io操作結果,這個函式是個阻塞函式。

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,並繼續下一次迴圈阻塞在getqueuedcompletionstatus()這裡。

具體的流程請看附圖,其中紅線表示是windows

系統進行的處理,不需要我們程式干預。

我們不停地發出非同步的wsasend/wsarecv io操作,具體的io處理過程由windows

系統完成,windows系統完成實際的io處理後,把結果送到完成埠上(如果有多個io都完成了,那麼就在完成埠那裡排成乙個佇列)。我們在另外乙個執行緒裡從完成埠不斷地取出io操作結果,然後根據需要再發出wsasend/wsarecv io操作

Winsock完成埠介紹

本文主要 一下windows平台上的完成埠開發及其與之相關的幾個重要的技術概念,這些概念都是與基於iocp的開發密切相關的,對開發人員來講,又不得不給予足夠重視的幾個概念 1 基於iocp實現的服務吞吐量 2 iocp模式下的執行緒切換 3 基於iocp實現的訊息的亂序問題。一 iocp簡介 提到i...

DELPHI中完成埠 IOCP 的簡單分析(1)

用delphi開發網路 已經有一段時間了!我發現在網上用vc來實現完成埠 iocp 的 很多,但是使用delphi來實現的就比較少了。對iocp講的清楚的就更少了。在這裡我把自己編寫delphi下的iocp寫出來,希望對剛學完成埠的朋友有個幫助。首先我們來了解一些在使用iocp的時候需要使用的一些結...

DELPHI中完成埠 IOCP 的簡單分析(1)

用delphi開發網路 已經有一段時間了!我發現在網上用vc來實現完成埠 iocp 的 很多,但是使用delphi來實現的就比較少了。對iocp講的清楚的就更少了。在這裡我把自己編寫delphi下的iocp寫出來,希望對剛學完成埠的朋友有個幫助。首先我們來了解一些在使用iocp的時候需要使用的一些結...