windows下的iocp和 linux下的epoll(#epoll我還沒有研究過#) 都是屬於socket 網路程式設計的範疇.不過其特色是:用固定很少的執行緒去管理成千上萬個socket連線.
其相當於 非同步通訊 .普通socket是同步,同步 可能要乙個執行緒乙個socket鏈結 去做,由於系統可以執行的執行緒數目有限,其就成為乙個瓶頸了. iocp/epoll 可以解決這個問題.
首先,你要懂得普通socket tcp的用法:
serve端 wsastartup,socket,bind listen,accept. accept之後就是阻塞的recv和send了.wsacleanup .其中accept之後可以createthread 工作執行緒 來單獨處理recv和send.
client端 wsastartup,socket,connect. connect之後就是阻塞的recv和send了.wsacleanup
而iocp是這樣的:
server端:
1其中 wsaaccept getqueuecompletionstatus 是阻塞的,或者說是 事件驅動的,其會在那裡等待...wsastartup
2createiocompletionport建立完成埠
3getsysteminfo獲取cpu核心數目,
4createthread建立cpu核心數目個工作執行緒,
5wsasocket ,
6bind ,
7listen , 8//
一下都在迴圈內
9wsaaccept ,
10createiocompletionport 建立accept的socketid與前面完成埠的繫結 ,
11wsarecv投遞操作(其實就是必須先接受一次資料,否則後面接受不到,不知道為什麼) ,
12//
迴圈結束
13wsacleanup
1415
16其中 工作執行緒 有不同的地方
17 getqueuedcompletionstatus 獲得資料,然後根據資料來決定 是wsarecv 還是 wsasend
可以看到iocp裡面用到了許多 wsa開頭的api,而其建立了多個工作執行緒,這就是執行緒池,但是你不用管理,getqueuecompletionstatus會自動進行管理的.
iocp與普通socket 兩個最重要的不同點 :
乙個就是 getqueuecompletionstatus ,這裡是阻塞的,根據接受的資料來wsarecv or wsasend.而普通的socket是直接在recv 和 send 阻塞的.iocp 則不需要這樣.iocp是針對伺服器端的,對於客戶端,隨便,跟普通socket客戶端一樣.另乙個就是前面的 wsaaccept ,這個接受到新的客戶端連線後,必須 先進行一次 wsarecv. 後續客戶端傳送的資料 則是上面的getqueuecompletionstatus 來做了.
附上我學習到的例子 非常的簡潔:
iocp 簡單 命令列 示例程式(伺服器和 6000socket鏈結 測試客戶端)
其他 iocp 完成埠 重疊io的東西 自己搜尋吧.
iocp模型分析:
windows iocp模型與linux epoll模組之比較:
小心使用IOCP完成埠
s createsocket 假定s返回值是10 createiocompletionport s,m hcompletionport,dword ptr a,0 wsasend s,wsasend s,wsasend s,wsasend s,wsasend s,這個時候,完成埠裡累計了多條跟s相關...
網路程式設計 完成埠IOCP
分類 網路程式設計 2009 12 31 11 20 755人閱讀收藏 舉報 裝置 windows作業系統上允許通訊的任何東西,比如檔案 目錄 序列口 並行口 郵件槽 命名管道 無名管道 套接字 控制台 邏輯磁碟 物理磁碟等。絕大多數與裝置打交道的函式都是createfile readfile wr...
IOCP 完成埠 開發手記 3
當建立iocp埠後,就要初始化連線監聽,這跟一般的socket是沒有什麼區別的,當然要把它關聯到iocp,否則就不會從iocp那裡得響應.接著就會建立滿足需要的接收請求,這樣就會收到連線進來.如果有連線進來,就會收在getqueued pletionstatus函式裡收到前面發出的請求包,接著就進行...