Freigeben über


PFN_WSK_ACCEPT Rückruffunktion (wsk.h)

Die WskAccept--Funktion akzeptiert eine eingehende Verbindung in einem Überwachungssocket.

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 Überwachungs- oder Datenstromsocket angibt, der für 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 nicht transparent. 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 Verteilertabelle, 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 Verteilertabelle auf NULL- für diese Ereignisrückruffunktionen festlegen, die nicht aktiviert werden. 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, auf der die eingehende Verbindung eingegangen ist. Der Puffer muss sich im nicht ausgelagerten Speicher befinden. Der Puffer muss auch groß genug sein, um den spezifischen SOCKADDR-Strukturtyp zu enthalten, der der Adressfamilie entspricht, die die WSK-Anwendung beim Erstellen des Überwachungssockets 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 ausgelagerten Speicher befinden. Der Puffer muss auch groß genug sein, um den spezifischen SOCKADDR-Strukturtyp zu enthalten, der der Adressfamilie entspricht, die die WSK-Anwendung beim Erstellen des Überwachungssockets angegeben hat. Dieser Zeiger ist optional und kann NULL-sein.

[in, out] Irp

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

Rückgabewert

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

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

Bemerkungen

Eine WSK-Anwendung kann die WskAccept--Funktion entweder für einen Überwachungssocket oder einen Datenstromsocket aufrufen, den sie zuvor an eine lokale Transportadresse gebunden hat, indem sie die WskBind--Funktion aufruft.

Das Verhalten der WskAccept--Funktion hängt davon ab, ob eine eingehende Verbindung auf die Aufnahme des Überwachungssockets wartet:

  • Wenn bereits eine eingehende Verbindung auf dem Überwachungssocket eingegangen ist und darauf wartet, akzeptiert zu werden, gibt die WskAccept--Funktion STATUS_SUCCESS zurück. In dieser Situation wird das IRP mit dem Erfolgsstatus abgeschlossen, und das IoStatus.Information Feld des IRP enthält einen Zeiger auf das Socketobjekt für den akzeptierten Socket.
  • Wenn eine eingehende Verbindung nicht auf die Annahme des Überwachungssockets wartet, gibt WskAccept STATUS_PENDING zurück, und das WSK-Subsystem stellt die IRP in die Warteschlange, bis eine eingehende Verbindung empfangen wird. Wenn eine eingehende Verbindung empfangen wird, schließt das WSK-Subsystem das IRP asynchron mit dem Erfolgsstatus ab. In diesem Fall enthält das IoStatus.Information Feld des IRP einen Zeiger auf das Socketobjekt für den akzeptierten Socket.
Wenn die WskAcceptEvent Ereignisrückruffunktion einer WSK-Anwendung in einem Überwachungssocket aktiviert ist und die Anwendung über einen ausstehenden Aufruf der WskAccept--Funktion im gleichen Überwachungssocket verfügt, wenn dann eine eingehende Verbindung eingeht, hat der ausstehende Aufruf an WskAccept Vorrang vor der WskAcceptEvent Ereignisrückruffunktion. Das WSK-Subsystem ruft die WskAcceptEvent Ereignisrückruffunktion der Anwendung nur auf, wenn keine IRPs von ausstehenden Aufrufen an WskAcceptin die Warteschlange gestellt werden. Eine WSK-Anwendung sollte jedoch nicht davon ausgehen, dass das WSK-Subsystem die WskAcceptEvent Ereignisrückruffunktion für einen Überwachungssocket mit einem ausstehenden Aufruf der WskAccept--Funktion nicht aufruft. Race conditions exist where the WSK subsystem could still call the WSK application's WskAcceptEvent event callback function for the socket. Die einzige Möglichkeit für eine WSK-Anwendung, um sicherzustellen, dass das WSK-Subsystem die WskAcceptEvent- Ereignisrückruffunktion für einen Überwachungssocket 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 einer der Ereignisrückruffunktionen des akzeptierten Sockets finden Sie unter Aktivieren und Deaktivieren von Ereignisrückruffunktionen.

Wenn eine WSK-Anwendung einen nicht-NULL- Zeiger im parameter LocalAddress angibt, müssen die Puffer, auf die diese Parameter verweisen, im RemoteAddress Parameter oder in beiden Parametern gültig bleiben, und wenn WskAccept STATUS_PENDING zurückgibt, müssen die Puffer, auf die von diesen Parametern verwiesen wird, gültig bleiben, bis das IRP abgeschlossen ist. Wenn die WSK-Anwendung die Puffer mit einer der ExAllocateXxx--Funktionen zugeordnet hat, kann der Speicher nicht mit der entsprechenden ExFree-Xxx--Funktion freigegeben werden, bis die IRP abgeschlossen ist. Wenn die WSK-Anwendung die Puffer auf dem Stapel zugeordnet hat, kann sie nicht von der Funktion zurückgegeben werden, die die WskAccept--Funktion aufruft, bis die IRP abgeschlossen ist.

Das WSK-Subsystem weist den Speicher für die Socketobjektstruktur ( WSK_SOCKET) für die akzeptierte Verbindung im Auftrag der WSK-Anwendung zu. Das WSK-Subsystem verteilt diesen Speicher, wenn der Socket geschlossen wird.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Verfügbar in Windows Vista und höheren Versionen der Windows-Betriebssysteme.
Zielplattform- Universal
Header- wsk.h (include Wsk.h)
IRQL- <= DISPATCH_LEVEL

Siehe auch

SOCKADDR-

WSK_CLIENT_CONNECTION_DISPATCH

WSK_PROVIDER_LISTEN_DISPATCH

WSK_PROVIDER_STREAM_DISPATCH

WSK_SOCKET

WskAcceptEvent-

WskBind-

WskCloseSocket

WskSocket-