工作者线程代码如下,一旦收到一个包之后,GetQueuedCompletionStatus就会一直返回1。第一次是正确的数据,之后一直都是长度为0的数据DWORD _stdcall WorkThread(LPVOID voidParam)
{
struct ThreadParam *param = (struct ThreadParam *)voidParam; HANDLE myIocp = param->iocpModule->myIocp;
DWORD bytesLen = 0;
ULONG_PTR key;
OVERLAPPED *overLapped;
DWORD err = 0;
while (1)
{
BOOL result = GetQueuedCompletionStatus(myIocp, &bytesLen, &key, &overLapped, 3600000);
err = GetLastError();
if (result)
{
Socket_Context *sc = (Socket_Context *)key;
Io_Context *ic = CONTAINING_RECORD(overLapped, Io_Context, overLapped);
if (ic->operationType == RECV_POSTED)
wprintf(L"OK!");
param->iocpModule->PostRecv(ic);
}
else
{
if (overLapped != NULL)
{
wprintf(L"GetQueuedCompletionSta tus error, err=%d", err);
}
else
{
if (err == WAIT_TIMEOUT)
{
wprintf(L"GetQueuedCompletionStatus time out");
}
else
{
wprintf(L"GetQueuedCompletionStatus error, err=%d", err);
}
}
}
}
return 0;
}

解决方案 »

  1.   

    DWORD _stdcall WorkThread(LPVOID voidParam)
    {
        struct ThreadParam *param = (struct ThreadParam *)voidParam;
     
        HANDLE myIocp = param->iocpModule->myIocp;
        DWORD bytesLen = 0;
        ULONG_PTR key;
        OVERLAPPED *overLapped;
        DWORD err = 0;
        while (1)
        {
            BOOL result = GetQueuedCompletionStatus(myIocp, &bytesLen, &key, &overLapped, 3600000);
            err = GetLastError();
            if (result)
            {
                Socket_Context *sc = (Socket_Context *)key;
                Io_Context *ic = CONTAINING_RECORD(overLapped, Io_Context, overLapped);
                if (ic->operationType == RECV_POSTED)
                    wprintf(L"OK!");
                param->iocpModule->PostRecv(ic);
            }
            else
            {
                if (overLapped != NULL)
                {
                    wprintf(L"GetQueuedCompletionSta tus error, err=%d", err);
                }
                else
                {
                    if (err == WAIT_TIMEOUT)
                    {
                        wprintf(L"GetQueuedCompletionStatus time out");
                    }
                    else
                    {
                        wprintf(L"GetQueuedCompletionStatus error, err=%d", err);
                    }
                }
            }
        }
        return 0;
    }红色那个值不能是随意值,该值是创建完成端口时,指定的那个值