示例下載
??????Win32重疊I/O(OverLapped I/O)的機制允許發起一個操作,然后在操作完成之后接受到信息。對于那種需要很長時間才能完成的操作來說重疊操作,有著很重要的意義。我們可以在發起一個操作后,在監聽線程中等待操作完成,而主線程可以做其他的事情。
??????在Win2000上,提供的可擴展的I/O模型就是使用完成端口。完成端口對在Windows的內部做了優化,提供了更高的效率。
??????可以把完成端口看成一個系統維護的隊列,操作系統將完成的重疊操作通知消息放到完成端口隊列,由于暴露“操作完成”,所以命名為“完成端口”。
?????????應用完成端口的步驟:
??????????????????1.創建完成端口句柄:
????????????????????????HANDLE hIocp;
????????????????????????hIocp=CreateCompletiom(
??????????????????????????????????????????????????????INVALID_HANDLE_VALUE,
??????????????????????????????????????????????????????NULL,
??????????????????????????????????????????????????????(ULONG_PRT)0,
???????????????????????????????????????????????????????0);
????????????????????????if(???hIocp == NULL){
??????????????????????????????????????????//創建失敗。
????????????????????????}
??????????????????2.關聯SOCKET 描述符與完成端口句柄
????????????????????????SOCKET s;
????????????????????????s=socket(AF_INET,SOCKE_STREAM,0);
????????????????????????if (s == INVALID_SOCKET){
??????????????????????????????///SOCKET 創建失敗處理??????
???????????????????????????}
????????????????????????if( CreateCompletionPort((HANDLE)s, hIocp,(ULONG_PRT)0,0) == NULL){
??????????????????????????????//關聯失敗
???????????????????????????}
??????????????????3.創建監聽線程.,?監聽線程可以創建多個,根據具體需要而定。
???????????????????????????CreateThread(CoPortThread,......);
??????????????????4.監聽線程函數:
????????????????????????DWORD CoPortThread(LPVOID lpParam){
????????????????????????????????????while(true){
?????????????????????????????????????????????bResult = GetQueuedCompletionStatus(ghCompletionPort, &dwNumRead, (DWORD*)&pCntx, &lpOverlapped, INFINITE);
??????????????????????????????????????????? if (bResult == FALSE && lpOverlapped == NULL)
?????????????????????????????????????????????? {?????????????????????
????????????????????????????????????????????????????????????????? FatalError("WorkerThread - GetQueuedCompletionStatus()錯誤.\n");
??????????????????????????????????????????????????????? }
??????????????????????????????????????????? else if (bResult == FALSE && lpOverlapped != NULL)
???????????????????????????????????????????????????? {
?????????????????????????????????????????????????????????????????????????????????fprintf(stderr,"用戶非正常退出.\n");?
??????????????????????????????????????????????????????? }
???????????????????????????????????????????????else if (dwNumRead == 0)
??????????????????????????????????????????????????????? {????
??????????????????????????????????????????????????????????????????????????????????????????fprintf(stderr, "用戶已經退出.\n");
????????????????????????????????????????????????????????????????????????????????????????? fprintf(stderr, "------------------.\n");
????????????????????????????????????????????????????????????? }
???????????????????????????????????????????????? else
????????????????????????????????????????????????????????????? {
????????????????????????????????????????????????????????????????????????printf("recv data from client: %s\n", pCntx->InBuffer);
??????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????? }
?????????????????????????????????????}
??????????????????????????????}