一開始學習完成端口編程的時候,我看的資料是小豬的關於完成端口的教程和源代碼。
好在,我還有那么一點點C++的底子,不是很好,勉強看得懂吧。
其實看得懂不是IOCP完成端口的具體原理,而是這些C++代碼結構邏輯而已。
很慘,對吧。
后來我采用Delphi的代碼結構來做,說真的,當時一樣是一塌糊塗,哈哈。
很多人說,IOCP完成端口被神化了,其實這個很正常啊,不懂的時候,看啥都是神秘的。
其實小豬的這個代碼很有用,他的執行測試Demo是我見到的最快的程序。
Delphi編碼的程序,很多人的程序我測試過了,反應確實沒有他快。客戶端發送幾百條數據,一邊發,服務端一邊不斷地接收刷新數據,幾乎沒有延遲。感覺的確過癮。
尤其是他的這個程序最難得的地方是把整個完成端口的流程合理簡潔地制作出來。
而不像其它人,繞了幾百個彎。
也許各人的理解不同,就有無數種結構。
但是能夠做到簡潔直接高效的,確實不多見。
所以我參考他的結構進行制作IOCP的內核。

測試的客戶端軟件,暫時使用下面這個:是C++代碼制作的,不影響Delphi制作的服務端,呵呵。

100個連接,總共密集發送3次數據,效率還可以。這些只是很小的測試。
其實多線程比較容易發生內存沖突現象,當我測試的時候,有個相當奇特的現象引我注意,比如:
1 (***************************************************************************) 2 (* 初始化監聽套接字 *) 3 (***************************************************************************) 4 function TComponentIocpSock.InitSOCKET(Const Addres:String;Const Port: Integer): Boolean; 5 begin 6 ------------------------------------------------------ 7 ------------------------------------------------------ 8 for I := 0 to FMAX_POST_ACCEPTEX - 1 do 9 begin 10 11 pAcceptIoContext:=GetNewIoContext;//PPerIoData(M_BusyIoDataList.Items[I]); 12 if not PostAccept(pAcceptIoContext) then 13 begin 14 MsgInfoEvent('PostAccept投遞不成功!'); 15 RemoveContext(pAcceptIoContext); 16 Result :=False; 17 break; 18 end; 19 pAcceptIoContext:=nil; 20 end; 21 MsgInfoEvent('2:初始化套接字成功.'); 22 Result :=True; 23 end;
紅色的地方是調用投遞函數進行投遞,然而四條線程分別執行完這塊For循環之后,才輪到:
21 MsgInfoEvent('2:初始化套接字成功.'); 22 Result :=True;
就是上面那里只執行一次,就等於是被分割出一塊來大家一起搶着執行,而后面卻只執行一次。
這種情況,到現在我才發現,真是想想很好笑。
后面再具體分析代碼的編程。
