Verwenden von HttpApi mit E / A-Abschlussports

8

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 eine OVERLAPPED -Struktur; Legen Sie für synchrone Aufrufe NULL 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 sofort ERROR_IO_PENDING zurückgibt und die aufrufende Anwendung dann GetOverlappedResult() 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?

    
André Caron 02.01.2011, 04:53
quelle

1 Antwort

3

Die Verwendung von IO-Completion-Ports ist theoretisch einfach, aber in der Praxis unmöglich: P

Die "normale" Verwendung ist:

  1. Rufen Sie CreateIOCompletionPort auf, um ein IO-Completion-Port-Handle zu erstellen.
  2. Erstellen Sie eine Reihe von Threads, und rufen Sie bei einem Aufruf von GetOverlappedResult für jeden Thread eine Schleife auf. GetOverlappedResult wird zurückgegeben, wenn eine mit dem Port verknüpfte überlappende Operation abgeschlossen wird und Strukturen angeben, welche Handle und Operation abgeschlossen wurde.
  3. Wenn Ihr Programm ausgeführt wird und Objekte erstellt, die es asynchron verarbeiten möchte, ordnet es jeden HANDLE dem IO CompletionPort-Handle zu, indem es CreateIOCompletionPort erneut aufruft.

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.

    
Chris Becke 02.01.2011, 15:21
quelle

Tags und Links