經過研究代碼,覺得有幾個函數必須要清楚原理。才能理解代碼,清楚流程。
異步模式:類似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函數,向每個工作者線程都發送—個特殊的完成數據包。該函數會指示每個線程都“立即結束並退出”.
出自:http://hi.baidu.com/drunkdream/item/b4b4b649dd6c9b0fc01613ac
>>>>我做個一個這樣的測試在Accept連接后,執行PostQueuedCompletionStatus,
PostQueuedCompletionStatus(lvIOPort, 0, 0, nil);
開啟有7個工作線程.只有一個線程的GetQueuedCompletionStatus,有返回值。
>>>>>>
我的理解是:
想IO端口中發送一個數據包到隊列中.會觸發一個GetQueuedCompletionStatus有返回值,並不會所有的線程中的GetQueuedCompletionStatus有返回值。
下一節,研究,這幾個函數的實際使用