Share via


WPUCompleteOverlappedRequest-Funktion (ws2spi.h)

Die WPUCompleteOverlappedRequest-Funktion führt überlappende E/A-Vervollständigungsbenachrichtigungen für überlappende E/A-Vorgänge aus.

Syntax

int WPUCompleteOverlappedRequest(
  [in]  SOCKET          s,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [in]  DWORD           dwError,
  [in]  DWORD           cbTransferred,
  [out] LPINT           lpErrno
);

Parameter

[in] s

Der von WPUCreateSocketHandle erstellte DienstanbietersocketHandle.The service provider socket created by WPUCreateSocketHandle.

[in] lpOverlapped

Ein Zeiger auf eine WSAOVERLAPPED-Struktur , die dem überlappenden E/A-Vorgang zugeordnet ist, dessen Abschluss benachrichtigt werden soll.

[in] dwError

Der Abschluss status des überlappenden E/A-Vorgangs, dessen Abschluss benachrichtigt werden soll.

[in] cbTransferred

Die Anzahl der Bytes, die an oder von Clientpuffern übertragen werden (die Übertragungsrichtung hängt von der Sende- oder Empfangsart des überlappenden E/A-Vorgangs ab, dessen Abschluss benachrichtigt werden soll).

[out] lpErrno

Ein Zeiger auf den Fehlercode, der sich aus der Ausführung dieser Funktion ergibt.

Rückgabewert

Wenn kein Fehler auftritt, gibt WPUCompleteOverlappedRequest null zurück und benachrichtigt den Abschluss des überlappenden E/A-Vorgangs entsprechend dem vom Client ausgewählten Mechanismus (signalisiert ein Ereignis in der WSAOVERLAPPED-Struktur, auf die von lpOverlapped verwiesen wird, und/oder Warteschlangen eine Vervollständigung status an den Vervollständigungsport melden, der dem Socket zugeordnet ist, wenn ein Vervollständigungsport zugeordnet ist). Andernfalls gibt WPUCompleteOverlappedRequest SOCKET_ERROR zurück, und ein bestimmter Fehlercode ist in lpErrno verfügbar.

Fehlercode Bedeutung
WSAEINVAL
Der Socket, der im s-Parameter übergeben wird, ist kein Socket, der von WPUCreateSocketHandle erstellt wurde.

Hinweise

Die WPUCompleteOverlappedRequest-Funktion führt überlappende E/A-Vervollständigungsbenachrichtigungen für überlappende E/A-Vorgänge aus, bei denen der vom Client angegebene Vervollständigungsmechanismus etwas anderes ist als der asynchrone Prozeduraufruf (APC) des Benutzermodus. Diese Funktion kann nur für Sockethandles verwendet werden, die von WPUCreateSocketHandle erstellt wurden.

**Hinweis** Diese Funktion unterscheidet sich von anderen Funktionen mit dem Präfix "WPU", da nicht über die Upcall-Tabelle auf sie zugegriffen wird. Stattdessen wird es direkt von Ws2_32.dll exportiert. Dienstanbieter, die diese Funktion aufrufen müssen, sollten eine Verbindung mit WS2_32.lib herstellen oder geeignete Betriebssystemfunktionen wie LoadLibrary und GetProcAddress verwenden, um den Funktionszeiger abzurufen.
 
Die Funktion **WPUCompleteOverlappedRequest** wird von Dienstanbietern verwendet, die ifS-Funktionalität (Installable File System) nicht direkt für die Sockethandles implementieren, die sie verfügbar machen. Es führt vervollständigungsbenachrichtigungen für alle überlappenden E/A-Anforderungen aus, für die die angegebene Vervollständigungsbenachrichtigung nicht ein Benutzermodus-APC ist. **WPUCompleteOverlappedRequest** wird nur für die Sockethandles unterstützt, die von WPUCreateSocketHandle erstellt wurden, und nicht für Sockets, die direkt von einem Dienstanbieter erstellt wurden.

Wenn der Client eine Benutzermodus-APC als Benachrichtigungsmethode auswählt, sollte der Dienstanbieter WPUQueueApc oder eine andere geeignete Betriebssystemfunktion verwenden, um die Vervollständigungsbenachrichtigung auszuführen. Wenn der Benutzermodus-APC vom Client nicht ausgewählt wird, kann ein Dienstanbieter, der IFS-Funktionen nicht direkt implementiert, nicht ermitteln, ob der Client dem Sockethandle einen Vervollständigungsport zugeordnet hat. Daher kann nicht bestimmt werden, ob die Vervollständigungsbenachrichtigungsmethode einen Vervollständigungs- status Datensatz an einem Vervollständigungsport anstehen oder ein Ereignis in der WSAOVERLAPPED-Struktur signalisieren soll. Die Windows Socket 2-Architektur verfolgt alle Vervollständigungsportzuordnungen mit einem von WPUCreateSocketHandle erstellten Socket nach und kann eine richtige Entscheidung zwischen der portbasierten Abschlussbenachrichtigung oder der ereignisbasierten Benachrichtigung treffen.

Wenn WPUCompleteOverlappedRequest eine Vervollständigungsanzeige in die Warteschlange stellt, wird das InternalHigh-Element der WSAOVERLAPPED-Struktur auf die Anzahl der übertragenen Bytes festgelegt. Anschließend wird der interne Member auf einen anderen betriebssystemabhängigen Wert als den sonderlichen Wert WSS_OPERATION_IN_PROGRESS festgelegt. Es kann zu einer leichten Verzögerung kommen, nachdem WPUCompleteOverlappedRequest zurückgegeben wird, bevor diese Werte angezeigt werden, da die Verarbeitung möglicherweise asynchron erfolgt. Der InternalHigh-Wert (Byteanzahl) wird jedoch garantiert, wenn Internal festgelegt wird.

WPUCompleteOverlappedRequest funktioniert wie angegeben (führt die vom Client angeforderte Vervollständigungsbenachrichtigung aus), unabhängig davon, ob das Sockethandle einem Vervollständigungsport zugeordnet wurde oder nicht.

Interaktion mit WSPGetOverlappedResult

Das Verhalten von WPUCompleteOverlappedRequest enthält einige Einschränkungen für die Implementierung von WSPGetOverlappedResult durch einen Dienstanbieter, da nur die Offset - und OffsetHigh-Member der WSAOVERLAPPED-Struktur ausschließlich vom Dienstanbieter gesteuert werden, aber drei Werte (Byteanzahl, Flags und Fehler) müssen von WSPGetOverlappedResult aus der Struktur abgerufen werden. Ein Dienstanbieter kann dies auf beliebige Weise erreichen, solange er ordnungsgemäß mit dem Verhalten von WPUCompleteOverlappedRequest interagiert. Eine typische Implementierung sieht jedoch wie folgt aus:

  • Zu Beginn der überlappenden Verarbeitung legt der Dienstanbieter Internal auf WSS_OPERATION_IN_PROGRESS fest.
  • Nach Abschluss des E/A-Vorgangs legt der Anbieter OffsetHigh auf den Windows Socket 2-Fehlercode fest, der sich aus dem Vorgang ergibt, legt Offset auf die Flags fest, die sich aus dem E/A-Vorgang ergeben, und ruft WPUCompleteOverlappedRequest auf, wobei die Anzahl der Übertragungsbytes als einen der Parameter übergeben wird. WPUCompleteOverlappedRequest legt Schließlich InternalHigh auf die Anzahl der Übertragungsbytes fest, und legt dann Internal auf einen anderen Wert als WSS_OPERATION_IN_PROGRESS fest.
  • Wenn WSPGetOverlappedResult aufgerufen wird, überprüft der Dienstanbieter Internal. Wenn es WSS_OPERATION_IN_PROGRESS ist, wartet der Anbieter auf dem Ereignishandle im hEvent-Member oder gibt einen Fehler zurück, basierend auf der Einstellung des FWAIT-Flags von WSPGetOverlappedResult. Wenn nicht oder nach Abschluss des Wartens nicht ausgeführt wird, gibt der Anbieter die Werte von InternalHigh, OffsetHigh und Offset als Übertragungsanzahl, Vorgangsergebnisfehlercode und Flags zurück.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile ws2spi.h

Weitere Informationen

WPUCreateSocketHandle

WPUQueueApc

WSAOVERLAPED

WSPGetOverlappedResult