Ich bin gerade auf Microsofts HTTP-Server-API . Die Einleitung sagt:
Die HTTP-Server-API ermöglicht Anwendungen die Kommunikation über HTTP, ohne Microsoft Internet Information Server (IIS) zu verwenden. Anwendungen können sich registrieren, um HTTP-Anforderungen für bestimmte URLs zu empfangen, HTTP-Anforderungen zu empfangen und HTTP-Antworten zu senden. Die HTTP-Server-API enthält SSL-Unterstützung, sodass Anwendungen Daten über sichere HTTP-Verbindungen ohne IIS austauschen können. Es ist auch für die Verwendung mit E / A-Abschluss-Ports vorgesehen.
Nachdem ich das cool gefunden habe, habe ich mir die Liste der Funktionen für beide Versionen der API gründlich angesehen. Jetzt ist der einzige andere Teil der Dokumentation, der I / O-Abschluss-Ports erwähnt, die HttpReceiveHttpRequest
() Funktion. Der letzte Parameter ist eine optionale OVERLAPPED
-Struktur mit dem folgende Beschreibung:
Setzen Sie für asynchrone Aufrufe
pOverlapped
auf eineOVERLAPPED
-Struktur; Legen Sie für synchrone AufrufeNULL
fest. Ein synchroner Aufruf blockiert, bis eine Anforderung in der angegebenen Warteschlange angekommen ist und einige oder alle abgerufen wurden, während ein asynchroner Aufruf sofortERROR_IO_PENDING
zurückgibt und die aufrufende Anwendung dannGetOverlappedResult()
oder E / A-Abschluss-Ports verwendet um festzustellen, wann die Operation abgeschlossen ist. Weitere Informationen zur Verwendung von OVERLAPPED-Strukturen für die Synchronisierung finden Sie unter Synchronisation und überlappende Eingabe und Ausgabe .
Es gibt keine anderen Informationen und alle Strukturen sind undurchsichtig und verbergen Verbindungsinformationen absichtlich. Beachten Sie außerdem, dass der Betreff "Synchronisierung und überlappende Eingabe und Ausgabe die HTTP-API nicht erwähnt.
Hat jemand eine Idee, wie man die Warteschlange der HTTP-API mit einem E / A-Abschluss-Port verbindet?
Die Verwendung von IO-Completion-Ports ist theoretisch einfach, aber in der Praxis unmöglich: P
Die "normale" Verwendung ist:
Jedes Mal, wenn die Anwendung eine asynchrone Operation auf dem HANDLE ausgibt (was durch das Übergeben einer OVERLAPPED-Struktur signalisiert wird), wird die Benachrichtigung über den abgeschlossenen Vorgang durch einen der Threads angezeigt, die auf GetOverlappedResult warten.
Die eindeutige Implikation ist, dass der von HttpCreateRequestQueue zurückgegebene HANDLE einem IO Completion-Port zugeordnet werden kann und nachfolgende asynchrone Operationen dazu führen, dass GetOverlappedResult das Ergebnis der Operation zurückgibt.