windows 2000以後的作業系統才支援iocp。winsock2.0才支援iocp。
首先要有乙個winsock2.pas的winsock2.0介面呼叫宣告單元。
winsock的版本號: winsock_version = $0202;
動態庫:ws2_32 = 'ws2_32.dll';
1)服務端首先要建立乙個監聽socket,用於監聽客戶端連線。
1.1)載入winsock2協議
if wsastartup($0202, wsadata) <> 0 then
raise esocketerror.create(getlastwsaerrorstr);
1.2)建立服務端監聽socket
var fsocket: tsocket;
1.3)為建立的服務端監聽socket準備ip位址,埠號。。。
var addr: tsockaddr;
fillchar(addr, sizeof(addr), 0);
addr.sin_family := af_inet;
addr.sin_port := htons(fport);
addr.sin_addr.s_addr := htonl(inaddr_any); //在任何位址上監聽,如果有多塊網絡卡,會每塊都監聽
1.4)為服務端監聽socket繫結
if bind(fsocket, @addr, sizeof(addr)) <> 0 then
raise esocketerror.create(getlastwsaerrorstr);
1.5)在服務端監聽socket上開啟監聽
if listen(fsocket, maxint) <> 0 then
raise esocketerror.create(getlastwsaerrorstr);
1.6)服務端監聽執行緒。當然也可以在主線程執行乙個while迴圈不停地接收客戶端的連線,但使用監聽執行緒顯然更好。
varclientsocket: tsocket;
clientsocket := wsaaccept(fsocket, nil, nil, nil, 0); // fsocket就是前面已經建立好的服務端監聽socket
if clientsocket <> invalid_socket then begin
postqueuedcompletionstatus(fiocphandle, 0, clientsocket, nil); // 客戶端連線被提交到完成埠佇列中
end;
2)iocp
2.1)建立完成埠。
var fiocphandle: thandle;
fiocphandle := createiocompletionport(invalid_handle_value, 0, 0, 0);
if fiocphandle = 0 then
raise esocketerror.create(getlasterrorstr);
2.1)將客戶端連線和iocp繫結
var csocket: pclientsocket;
createiocompletionport(clientsocket, fiocphandle, dword(csocket), 0);
2.2)接收客戶端資料
var fiocprecv: piocprecord;
iflags, itransfer: cardinal;
3)工作執行緒處理接收到的客戶端資料
3.1)工作執行緒是最繁忙,伺服器上cpu的數量決定了工作執行緒的數量,cpu數量越多可以建立的工作執行緒數量也就越多。
tclientsocket = record
lock: tcriticalsection;
sockethandle: tsockethandle;
iocprecv: tiocprecord; //投遞請求結構體
idledt: tdatetime;
end;
pclientsocket = ^tclientsocket;
varclientsocket: pclientsocket;
iocprecord: piocprecord;
iworkcount: cardinal;
iocp大致的流程就是這樣,當然服務端傳送資料給客戶端的**此處省略,相信讀者根據接收**已經知道怎麼弄了。
iocp為我們提供了乙個系統級的訊息佇列(稱之為完成佇列),事件迴圈就是圍繞著這個完成佇列展開的。在發起io操作後系統會進行非同步處理(如果能立刻處理的話也會直接處理掉),當操作完成後自動向這個佇列投遞一條訊息,不管是直接處理還是非同步處理,最後總會投遞完成訊息。
完成埠iocp和重疊埠
windows下的iocp和 linux下的epoll epoll我還沒有研究過 都是屬於socket 網路程式設計的範疇.不過其特色是 用固定很少的執行緒去管理成千上萬個socket連線.其相當於 非同步通訊 普通socket是同步,同步 可能要乙個執行緒乙個socket鏈結 去做,由於系統可以執...
小心使用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...