Frage zu IOCP und WSARecv return



  • Hi!

    Wenn WSARecv() NULL zurückgibt, bekommt man dann vom System noch ein completion packet bei GetQueuedCompletionStatus, oder nicht? Leider ist es für mich nicht eindeutig dokumentiert.

    MSDN schrieb:

    If no error occurs and the receive operation has completed immediately, WSARecv returns zero. In this case, the completion routine will have already been scheduled to be called once the calling thread is in the alertable state.

    Nur was heißt das genau...

    Also mir geht es darum:

    GetQueuedCompletionStatus...
    
    switch(operation)
        case Accept:
            WSARecv // Post first (Initiate)
        case Receive:
            WSARecv // Post next
    

    Also wird "case Receive:" erreicht, wenn das erste WSARecv() NULL zurückgibt? Oder nur, wenn last error = WSA_IO_PENDING?

    Denn würde jetzt bei "case Accept:" WSARecv() NULL zurückgeben, und es würde KEIN packet geposted werden, dann würde ja nichts mehr weiter gehen. Ich müsste also so lange WSARecv() aufrufen bis WSA_IO_PENDING.
    Aber ist das nun nötig oder nicht?



  • Du haust da ganz schön was durcheinander.

    > In this case, the completion routine will have already been scheduled to be called once the calling thread is in the alertable state.

    Was denn nun? Arbeitest du mit IOCPs oder Completion-Routinen als Notifikations-Modell? Das hat doch mit IOCPs nichts zu tun.



  • Ich dachte, als completion routine könnte man auch einen IOCP sehen.

    Naja, die Antwort ist vermutlich: Unnötig. Wenn ret == NULL oder lasterror == pending, kommt ein completion packet. Ansonsten nicht.



  • Nein. Completion-Routines sind ein wohl definiertes Notifikations-Modell und hat mit IOCP nichts zu tun, bis auf, dass IOCP auch eins ist. CRs sind APCs, die als Funktionspointer vielen Overlapped-Operationen übergeben werden können.
    Es wird bei einem Overlapped-Aufruf von WSARecv() immer SOCKET_ERROR zurückgegeben (Bei Erfolg mit WSAGetLastError() == WSA_IO_PENDING). Der IOCP wird dich auf jeden Fall informieren, sofern der Status PENDING betreten wurde. Ist WSAGetLastError() ein anderer, wurde die Operation nicht gestartet und de IOCP kann auch auf keine Notifikation reagieren.



  • thx, DAS wollte ich wissen.


Anmelden zum Antworten