请教一个I/O完成端口问题?
- C/C++ code
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); }}请问下两个问题?
1.每次我发送一个数据过来的时候,
if(!bOk)
{
::closesocket(pPerHandle->s);
::GlobalFree(pPerHandle);
::GlobalFree(pOverLapped);
continue;
}
GlobalFree(pPerHandle)会提示无法读取?
2.::GetQueuedCompletionStatus(hcom,&dwTrans,(PULONG_PTR)&pPerHandle,&pOverLapped,WSA_INFINITE)不是阻塞的吗?怎么函数会立即返回值?
[解决办法]
完全看不懂 你是高手
[解决办法]
If a socket handle associated with a completion port is closed, GetQueuedCompletionStatus returns ERROR_SUCCESS, with *lpOverlapped non-NULL and lpNumberOfBytes equal zero.
[解决办法]
建议单步调试。。。。。
[解决办法]