Timeout mit WSARecv und CompletionPort



  • Hi allerseits ..

    Ich bin gerade daran einen Server zu schreiben, der auf Overlapped IO mit Completion Ports basiert. Das heisst ich mache einen WASRecv und warte schliesslich mit GetQueuedCompletionStatus auf die Completion von irend einem registrierten Socket-Handle. Ich will aber nicht unbedingt ewig warten, sondern die Möglichkeit für einen Timeout einbauen. GetQueuedCompletionStatus hat einen Timeout Parameter. Da Diese Funktion aber für alle angemeldeten Sockets aufgerufen wird, bringt mir dieser nicht wirklich viel. Ich könnte mir bei jedem Socket merken, wann der letzte read abgesetzt wurde, auf GetQueuedCompletionStatus einen timeout setzten und schliesslich bei jedem aufwachen von GetQueuedCompletionStatus auf jedem Socket prüfen, ob die maximale Zeit seit dem letzten WSARev überschritten ist. Das wäre eine Variante aber eine relativ mühsame. Lieber wäre mir, wenn man beim WSARev einen Timeout angeben könnte und er dann so oder so eine Completion queuet, wenn diese abgelaufen ist. Das geht leider nicht 😞 Aber vielleicht könnte man irgendwie ein Flag auf dem Socket-Handle oder so setzen, um diesen Effekt zu erziehlen.

    Hat da vielleicht jemand Erfahrungen mit sowas oder vielleicht sogar schon mal gemacht?

    Vielen Dank und Grüsse! Dominic



  • Ich würde Timer Queue Timer dafür benutzen

    http://msdn.microsoft.com/en-us/library/ms686796



  • Hallo,

    prinzipiell läßt sich per setsockopt und SO_RCVTIMEO ein Intervall,
    für Timeouts festlegen, ( zurück gibts ein WSAETIMEDOUT )

    dem Namen nach sollte sich das ja auf das socket auswirken, ich weiß nur
    nicht ob das in dem Overlapped Schema weiterhilft,



  • The socket options SO_RCVTIMEO and SO_SNDTIMEO apply only to blocking sockets.


Anmelden zum Antworten