请教一个I/O完成端口问题?
DWORD WINAPI SockServer::workThread(LPVOID pdata){ HANDLE hcom=(HANDLE)pdata; DWORD dwTrans; PPER_HANDLE_DATA pPerHandle; OVERLAPPED *pOverLapped; while(true) { WaitForSingleObject(hSemaphore,INFINITE); bool bOk=::GetQueuedCompletionStatus(hcom,&dwTrans,(PULONG_PTR)&pPerHandle,&pOverLapped,WSA_INFINITE); if(!bOk) { ::closesocket(pPerHandle->s); ::GlobalFree(pPerHandle); ::GlobalFree(pOverLapped); continue; } if(dwTrans==0&&(pPerHandle->nOperationType==OP_READ||pPerHandle->nOperationType==OP_WRITE)) { ::closesocket(pPerHandle->s); ::GlobalFree(pPerHandle); ::GlobalFree(pOverLapped); } switch(pPerHandle->nOperationType) { case OP_READ: pPerHandle->buf[dwTrans]='\0'; cout<<pPerHandle->buf; WSABUF buf; buf.buf=pPerHandle->buf; buf.len=BUFFER_SIZE; DWORD nFlag=0; ::WSARecv(pPerHandle->s,&buf,1,&dwTrans,&nFlag,pOverLapped,NULL); break; } } return 0;}DWORD WINAPI SockServer::serverListen(LPVOID pData){ while(true) { ::WaitForSingleObject(hEvent,INFINITE); sockaddr_in sockin; int sockinLength=sizeof(sockin); SOCKET client=::accept(m_server,(sockaddr*)&sockin,&sockinLength); PPER_HANDLE_DATA phdata=(PPER_HANDLE_DATA)::GlobalAlloc(GPTR,sizeof(PER_HANDLE_DATA)); phdata->s=client; memcpy(&phdata->addr,&sockin,sockinLength); phdata->nOperationType=OP_READ; ::CreateIoCompletionPort((HANDLE)phdata->s,hComplection,(ULONG_PTR)phdata,0); OVERLAPPED *pOLP=(OVERLAPPED *)::GlobalAlloc(GPTR,sizeof(OVERLAPPED)); WSABUF buf; buf.buf=phdata->buf; cout<<phdata->buf<<endl; buf.len=BUFFER_SIZE; DWORD dwRecv; DWORD dwFlag=0; ::WSARecv(phdata->s,&buf,1,&dwRecv,&dwFlag,pOLP,NULL); ReleaseSemaphore(hSemaphore,1,NULL); }}