今天研究了一下 windows特有的 完成端口 IOCP 重疊IO端口 ,記錄下它與普通socket的區別


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 WSAStartup
 2 CreateIoCompletionPort創建完成端口
 3 GetSystemInfo獲取CPU核心數目,
 4 CreateThread創建CPU核心數目個工作線程, 
 5 WSASocket  , 
 6 bind ,
 7 listen , 
 8  // 一下都在循環內
 9 WSAAccept  , 
10 CreateIoCompletionPort 創建accept的SocketID與前面完成端口的綁定 , 
11 WSARecv投遞操作(其實就是必須先接受一次數據,否則后面接受不到,不知道為什么) ,
12 //循環結束
13 WSACleanup
14 
15 
16 其中 工作線程 有不同的地方
17 GetQueuedCompletionStatus 獲得數據,然后根據數據來決定 是WSARecv 還是 WSASend

其中 WSAAccept GetQueueCompletionStatus 是阻塞的,或者說是 事件驅動的,其會在那里等待...

可以看到IOCP里面用到了許多 WSA開頭的API,而其創建了多個工作線程,這就是線程池,但是你不用管理,GetQueueCompletionStatus會自動進行管理的.

IOCP與普通socket 兩個最重要的不同點 :

一個就是 GetQueueCompletionStatus ,這里是阻塞的,根據接受的數據來WSARecv or WSASend.而普通的socket是直接在recv 和 send 阻塞的.IOCP 則不需要這樣.

另一個就是前面的 WSAAccept ,這個接受到新的客戶端連接后,必須 先進行一次 WSARecv. 后續客戶端發送的數據 則是上面的GetQueueCompletionStatus 來做了.

IOCP是針對服務器端的,對於客戶端,隨便,跟普通socket客戶端一樣.

 

 

附上我學習到的例子 非常的簡潔:

IOCP 簡單 命令行 示例程序(服務器和 6000socket鏈接 測試客戶端)

http://files.cnblogs.com/ayanmw/testiocp2.zip

 

在附上一篇文章,看完例子 自己理解下,再去看理論:

http://blog.csdn.net/piggyxp/article/details/6922277

其他 IOCP 完成端口 重疊IO的東西 自己搜索吧.

IOCP模型分析:

http://linux.it219.com/archives/214

Windows IOCP模型與Linux EPOLL模塊之比較:

http://blog.csdn.net/ljmwork/article/details/7871922

搜索:iocp linux 獲得更多區別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM