1

私のメイン スレッドは、複数の I/O ワーカー スレッドを作成します。次に、次のようにして、メイン スレッドから I/O 要求を開始します。

{
    ...
    IoRequest *pIoRequest = new IoRequest(m_socket);
    pIoRequest->SetBuffer(vecCommandData); // vector of BYTEs
    pIoRequest->SetOperationType(OP_TYPE_SEND);
    WSASend(m_socket, pIoRequest->GetWsaBuffer(), 1, NULL, 0, pIoRequest, NULL);
    ...
}

I/O ワーカー スレッドのある時点で、要求が完了し、IoRequest オブジェクトのバッファーが有効な応答データで満たされます。

DWORD WINAPI WorkerThreadProc(LPVOID lpParameter)
{
    IoCompletionPort *pIocp = reinterpret_cast<IoCompletionPort*>(lpParameter);    
    ...
    while (true)
    {
        BOOL bReturn = pIocp->GetStatus(&ulCompletionKey, &dwNumberOfBytesTransferred, (LPOVERLAPPED*)&pIoRequest);
        ...
        switch (pIoRequest->GetOperationType())
        {
        ...
        case OP_TYPE_RECEIVE_DATA:
            {
                ...
                // the requested I/O operation has completed and pIoRequest's buffer now contains valid response data!
                break;
            } 
        ...
        }
    }

    return 0;
}

WSASend() を呼び出した後、メイン スレッドをアラート可能な待機状態にし、準備ができたらいつでも応答データを受信できるようにするにはどうすればよいですか?

4

1 に答える 1

2

IOCP サーバーでは、通常は GetQueuedCompletionStatus() です。

于 2012-08-06T12:06:30.457 に答える