經過研究代碼,覺得有幾個函數必須要清楚原理。才能了解代碼,清楚流程。
異步模式:類似form.show();
阻塞模式:類似form.showModal();
WSAAccept;
當用戶端有連接配接請求的時候,WSAAccept函數會新建立一個套接字cSocket。
其他的參數可以檢視MSDN,和google。
需要說明的一點是這個函數不是異步的,是阻塞模式。
WSARecv;
收取socket的資料
這個函數是異步模式,執行後馬上傳回。
資料接收到後,GetQueuedCompletionStatus,會傳回
GetQueuedCompletionStatus:
實作從指定的IOCP請求隊列中擷取請求。
當隊列為空時,對此函數的調用将被阻塞。
當隊列不為空時,被阻塞的線程将以後進先出(LIFO)順序被請求出去.
PostQueuedCompletionStatus:
CSDN上面的解釋
Posts an I/O completion packet to an I/O completion port.
向IO完成端口Post一個I/O完成資料包。
//也有一個blogs上面是這樣解釋
>>>PostQueuedCompletionStatus函數,向每個工作者線程都發送—個特殊的完成資料包。該函數會訓示每個線程都“立即結束并退出”.
>>>>我做個一個這樣的測試在Accept連接配接後,執行PostQueuedCompletionStatus,
PostQueuedCompletionStatus(lvIOPort, 0, 0, nil);
開啟有7個工作線程.隻有一個線程的GetQueuedCompletionStatus,有傳回值。
>>>>>>
我的了解是:
想IO端口中發送一個資料包到隊列中.會觸發一個GetQueuedCompletionStatus有傳回值,并不會所有的線程中的GetQueuedCompletionStatus有傳回值。
下一節,研究,這幾個函數的實際使用