PFN_WSK_ACCEPT Rückruffunktion (wsk.h)

Die WskAccept-Funktion akzeptiert eine eingehende Verbindung auf einem Lauschsocket.

Syntax

PFN_WSK_ACCEPT PfnWskAccept;

NTSTATUS PfnWskAccept(
  [in]            PWSK_SOCKET ListenSocket,
                  ULONG Flags,
  [in, optional]  PVOID AcceptSocketContext,
  [in, optional]  const WSK_CLIENT_CONNECTION_DISPATCH *AcceptSocketDispatch,
  [out, optional] PSOCKADDR LocalAddress,
  [out, optional] PSOCKADDR RemoteAddress,
  [in, out]       PIRP Irp
)
{...}

Parameter

[in] ListenSocket

Ein Zeiger auf eine WSK_SOCKET-Struktur , die das Socketobjekt für den Lausch- oder Streamsocket angibt, der auf eine eingehende Verbindung überprüft wird.

Flags

Dieser Parameter ist für die Systemverwendung reserviert. Eine WSK-Anwendung muss diesen Parameter auf Null festlegen.

[in, optional] AcceptSocketContext

Ein Zeiger auf einen vom Aufrufer bereitgestellten Kontext für den akzeptierten Socket. Das WSK-Subsystem übergibt diesen Zeiger an die Ereignisrückruffunktionen des akzeptierten Sockets. Die Kontextinformationen sind für das WSK-Subsystem undurchsichtig. Die Kontextinformationen müssen im nicht ausgelagerten Speicher gespeichert werden. Wenn die WSK-Anwendung keine Ereignisrückruffunktionen für den akzeptierten Socket aktiviert, sollte dieser Zeiger auf NULL festgelegt werden.

[in, optional] AcceptSocketDispatch

Ein Zeiger auf eine Konstante WSK_CLIENT_CONNECTION_DISPATCH-Struktur . Diese Struktur ist eine Dispatchtabelle, die Zeiger auf die Ereignisrückruffunktionen für den akzeptierten Socket enthält. Wenn die WSK-Anwendung nicht alle Ereignisrückruffunktionen für den akzeptierten Socket aktiviert, sollte sie die Zeiger in der Verteilungstabelle für die Ereignisrückruffunktionen auf NULL festlegen, die sie nicht aktiviert. Wenn die WSK-Anwendung keine Ereignisrückruffunktionen für den akzeptierten Socket aktiviert, sollte dieser Zeiger auf NULL festgelegt werden.

[out, optional] LocalAddress

Ein Zeiger auf einen vom Aufrufer zugewiesenen Puffer, der die lokale Transportadresse empfängt, an der die eingehende Verbindung eingegangen ist. Der Puffer muss sich im Nicht-Auslagerungsspeicher befinden. Der Puffer muss außerdem groß genug sein, um den spezifischen SOCKADDR-Strukturtyp zu enthalten, der der Adressfamilie entspricht, die die WSK-Anwendung beim Erstellen des Lauschockets angegeben hat. Dieser Zeiger ist optional und kann NULL sein.

[out, optional] RemoteAddress

Ein Zeiger auf einen vom Aufrufer zugewiesenen Puffer, der die Remotetransportadresse empfängt, von der die eingehende Verbindung stammt. Der Puffer muss sich im Nicht-Auslagerungsspeicher befinden. Der Puffer muss außerdem groß genug sein, um den spezifischen SOCKADDR-Strukturtyp zu enthalten, der der Adressfamilie entspricht, die die WSK-Anwendung beim Erstellen des Lauschockets angegeben hat. Dieser Zeiger ist optional und kann NULL sein.

[in, out] Irp

Ein Zeiger auf einen vom Aufrufer zugewiesenen IRP, den das WSK-Subsystem verwendet, um den Annahmevorgang asynchron abzuschließen. Weitere Informationen zur Verwendung von IRPs mit WSK-Funktionen finden Sie unter Verwenden von IRPs mit Winsock-Kernelfunktionen.

Rückgabewert

WskAccept gibt einen der folgenden NTSTATUS-Codes zurück:

Rückgabecode Beschreibung
STATUS_SUCCESS
Eine eingehende Verbindung wurde erfolgreich akzeptiert. Die IRP wird erfolgreich status abgeschlossen.
STATUS_PENDING
Das IRP wurde vom WSK-Subsystem in die Warteschlange gestellt, das auf eine eingehende Verbindung im Lauschocket wartet.
STATUS_FILE_FORCED_CLOSED
Der Socket ist nicht mehr funktionsfähig. Die IRP wird mit einem Fehler status abgeschlossen. Die WSK-Anwendung muss die WskCloseSocket-Funktion aufrufen, um den Socket so schnell wie möglich zu schließen.
Andere status Codes
Ein Fehler ist aufgetreten. Die IRP wird mit einem Fehler status abgeschlossen.

Hinweise

Eine WSK-Anwendung kann die WskAccept-Funktion entweder für einen Lauschsocket oder einen Streamsocket aufrufen, den sie zuvor durch Aufrufen der WskBind-Funktion an eine lokale Transportadresse gebunden hat.

Das Verhalten der WskAccept-Funktion hängt davon ab, ob eine eingehende Verbindung darauf wartet, vom Lauschocket akzeptiert zu werden:

  • Wenn bereits eine eingehende Verbindung auf dem Lauschsocket eingegangen ist und darauf wartet, akzeptiert zu werden, gibt die WskAccept-Funktion STATUS_SUCCESS zurück. In diesem Fall wird das IRP erfolgreich status abgeschlossen, und das Feld IoStatus.Information des IRP enthält einen Zeiger auf das Socketobjekt für den akzeptierten Socket.
  • Wenn eine eingehende Verbindung nicht darauf wartet, für den lauschenden Socket akzeptiert zu werden, gibt WskAccept STATUS_PENDING zurück, und das WSK-Subsystem stellt das IRP in die Warteschlange, bis eine eingehende Verbindung empfangen wird. Wenn eine eingehende Verbindung empfangen wird, schließt das WSK-Subsystem die IRP mit Erfolg status asynchron ab. In diesem Fall enthält das Feld IoStatus.Information des IRP einen Zeiger auf das Socketobjekt für den akzeptierten Socket.
Wenn die WskAcceptEvent-Ereignisrückruffunktion einer WSK-Anwendung auf einem lauschenden Socket aktiviert ist und die Anwendung einen ausstehenden Aufruf der WskAccept-Funktion auf demselben Überwachungssocket hat, hat der ausstehende Aufruf von WskAccept Vorrang vor der WskAcceptEvent-Ereignisrückruffunktion , wenn eine eingehende Verbindung eingeht. Das WSK-Subsystem ruft die WskAcceptEvent-Ereignisrückruffunktion der Anwendung nur auf, wenn keine IRPs aus ausstehenden Aufrufen von WskAccept in die Warteschlange gestellt werden. Eine WSK-Anwendung sollte jedoch nicht davon ausgehen, dass das WSK-Subsystem die WskAcceptEvent-Ereignisrückruffunktion der Anwendung für einen lauschenden Socket, der über einen ausstehenden Aufruf der WskAccept-Funktion verfügt, nicht aufruft. Es gibt Racebedingungen, bei denen das WSK-Subsystem weiterhin die WskAcceptEvent-Ereignisrückruffunktion der WSK-Anwendung für den Socket aufrufen kann. Die einzige Möglichkeit für eine WSK-Anwendung sicherzustellen, dass das WSK-Subsystem die WskAcceptEvent-Ereignisrückruffunktion der Anwendung für einen Lauschocket nicht aufruft, besteht darin, die WskAcceptEvent-Ereignisrückruffunktion der Anwendung im Socket zu deaktivieren.

Wenn die WskAccept-Funktion erfolgreich eine eingehende Verbindung akzeptiert, sind alle Ereignisrückruffunktionen im akzeptierten Socket standardmäßig deaktiviert. Weitere Informationen zum Aktivieren der Ereignisrückruffunktionen des akzeptierten Sockets finden Sie unter Aktivieren und Deaktivieren von Ereignisrückruffunktionen.

Wenn eine WSK-Anwendung einen Zeiger ungleich NULL im Parameter LocalAddress, im RemoteAddress-Parameter oder in beiden Parametern angibt und WskAccept STATUS_PENDING zurückgibt, müssen die Puffer, auf die von diesen Parametern verwiesen wird, bis zum Abschluss des IRP gültig bleiben. Wenn die WSK-Anwendung die Puffer mit einer der ExAllocateXxx-Funktionen zugeordnet hat, kann sie den Speicher mit der entsprechenden ExFreeXxx-Funktion erst freigeben, wenn die IRP abgeschlossen ist. Wenn die WSK-Anwendung die Puffer im Stapel zugeordnet hat, kann sie erst nach Abschluss des IRP von der Funktion zurückgeben, die die WskAccept-Funktion aufruft.

Das WSK-Subsystem ordnet den Arbeitsspeicher für die Socketobjektstruktur ( WSK_SOCKET) für die akzeptierte Verbindung im Namen der WSK-Anwendung zu. Das WSK-Subsystem gibt die Zuordnung dieses Arbeitsspeichers auf, wenn der Socket geschlossen wird.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar in Windows Vista und höheren Versionen der Windows-Betriebssysteme.
Zielplattform Universell
Header wsk.h (einschließen von Wsk.h)
IRQL <= DISPATCH_LEVEL

Weitere Informationen

SOCKADDR

WSK_CLIENT_CONNECTION_DISPATCH

WSK_PROVIDER_LISTEN_DISPATCH

WSK_PROVIDER_STREAM_DISPATCH

WSK_SOCKET

WskAcceptEvent

WskBind

WskCloseSocket

WskSocket