读书人

请问一个I/O完成端口有关问题

发布时间: 2012-04-09 13:41:24 作者: rapoo

请教一个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.


[解决办法]
建议单步调试。。。。。
[解决办法]
探讨

If a socket handle associated with a completion port is closed, GetQueuedCompletionStatus returns ERROR_SUCCESS, with *lpOverlapped non-NULL and lpNumberOfBytes equal zero.

读书人网 >C++

热点推荐