Freigeben über


PFN_WSK_RECEIVE_FROM Rückruffunktion (wsk.h)

Die WskReceiveFrom-Funktion empfängt ein Datagramm und alle zugehörigen Steuerelementinformationen von einer Remotetransportadresse.

Syntax

PFN_WSK_RECEIVE_FROM PfnWskReceiveFrom;

NTSTATUS PfnWskReceiveFrom(
  [in]            PWSK_SOCKET Socket,
  [in]            PWSK_BUF Buffer,
                  ULONG Flags,
  [out, optional] PSOCKADDR RemoteAddress,
  [in, out]       PULONG ControlLength,
  [out, optional] PCMSGHDR ControlInfo,
  [out, optional] PULONG ControlFlags,
  [in, out]       PIRP Irp
)
{...}

Parameter

[in] Socket

Ein Zeiger auf eine WSK_SOCKET Struktur, die das Socketobjekt für den Datagrammsocket angibt, von dem das Datagramm empfangen werden soll.

[in] Buffer

Ein Zeiger auf eine initialisierte WSK_BUF Struktur, die den Datenpuffer beschreibt, der das Datagramm aus dem Socket empfängt.

Flags

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

[out, optional] RemoteAddress

Ein Zeiger auf einen vom Aufrufer zugewiesenen Puffer, der die Remotetransportadresse empfängt, von der das empfangene Datagramm 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 Datagrammsockets angegeben hat. Dieser Zeiger ist optional und kann NULL-sein.

[in, out] ControlLength

Ein Zeiger auf eine ULONG, die die Größe des Puffers angibt, auf den der ControlInfo-Parameter verweist. Wenn der Empfangsvorgang abgeschlossen ist, empfängt die Variable die Größe der Steuerelementinformationen, die dem empfangenen Datagramm zugeordnet sind. Wenn der zurückgegebene Wert null ist, sind keine Steuerelementinformationen für das Datagramm vorhanden. Dieser Zeiger ist optional und kann NULL-sein. Wenn dieser Parameter NULL-ist, wird der ControlInfo-Parameter ignoriert.

[out, optional] ControlInfo

Ein Zeiger auf einen vom Aufrufer zugewiesenen Puffer, der die Steuerelementinformationen empfängt, die dem empfangenen Datagramm zugeordnet sind. Die Steuerelementinformationsdaten, die einem Datagramm zugeordnet sind, bestehen aus einem oder mehreren Steuerelementdatenobjekten, von denen jede mit einer CMSGHDR Struktur beginnt. Wenn keine Steuerelementinformationen für das empfangene Datagramm vorhanden sind, sind die Inhalte des Puffers nicht definiert. Dieser Zeiger ist optional und kann NULL-sein. Wenn der parameter ControlInfoLengthNULList, sollte der parameter ControlInfoNULLsein.

[out, optional] ControlFlags

Ein Zeiger auf eine ULONG-Typvariable, die den bitweisen OR einer Kombination der folgenden Flags empfängt:

MSG_BCAST

Das Datagramm wurde als Übertragung auf Linkebene oder mit einer Ziel-Transportadresse empfangen, die eine Übertragungsadresse ist.

MSG_MCAST

Das Datagramm wurde mit einer Zieltransportadresse empfangen, die eine Multicastadresse ist.

MSG_TRUNC

Das Datendiagramm wurde abgeschnitten, da die Größe des Datagramms größer als die Größe des Puffers war, der durch den Parameter Buffer angegeben wird.

MSG_CTRUNC

Die Steuerelementinformationsdaten wurden abgeschnitten, da die Anzahl der Byte der Steuerelementinformationen größer als die Größe des Puffers war, der durch den parameter ControlInfo angegeben wird.

Dieser Parameter ist optional und kann NULL-werden.

[in, out] Irp

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

Rückgabewert

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

Rückgabecode Beschreibung
STATUS_SUCCESS
Daten wurden erfolgreich vom Socket empfangen. Das IRP wird mit dem Erfolgsstatus abgeschlossen. Das IoStatus.Information Feld des IRP enthält die Anzahl der empfangenen Bytes.
STATUS_PENDING
Das WSK-Subsystem konnte das Datagramm nicht sofort vom Socket empfangen. Das WSK-Subsystem schließt das IRP ab, nachdem es das Datagramm vom Socket empfangen hat. Der Status des Empfangsvorgangs wird im feld IoStatus.Status IRP zurückgegeben. Wenn der Vorgang erfolgreich ist, enthält das IoStatus.Information Feld des IRP die Anzahl der empfangenen Bytes.
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

Wenn die WSK-Anwendung eine feste Remotetransportadresse für den Datagrammsocket festgelegt hat, werden datendiagramme, die von einer anderen Remotetransportadresse empfangen werden, vom WSK-Subsystem verworfen. Weitere Informationen zum Festlegen der Remotetransportadresse für einen Datagrammsocket finden Sie unter SIO_WSK_SET_REMOTE_ADDRESS.

Wenn die WskReceiveFromEvent Ereignisrückruffunktion einer WSK-Anwendung in einem Datagrammsocket aktiviert ist und die Anwendung auch über einen ausstehenden Aufruf der WskReceiveFrom-Funktion im gleichen Datagrammsocket verfügt, Wenn dann Datagramme eingehen, hat der ausstehende Aufruf der WskReceiveFrom-Funktion Vorrang vor der WskReceiveFromEvent Ereignisrückruffunktion. Das WSK-Subsystem ruft die WskReceiveFromEvent Ereignisrückruffunktion nur auf, wenn keine IRPs aus ausstehenden Aufrufen der WskReceiveFrom-Funktion in die Warteschlange gestellt werden. Eine WSK-Anwendung sollte jedoch nicht davon ausgehen, dass das WSK-Subsystem die WskReceiveFromEvent- Ereignisrückruffunktion für einen Datagrammsocket mit einem ausstehenden Aufruf der WskReceiveFrom-Funktion nicht aufruft. Race conditions exist where the WSK subsystem could still call the WSK application's WskReceiveFromEvent event callback function for the socket. Die einzige Möglichkeit für eine WSK-Anwendung, um sicherzustellen, dass das WSK-Subsystem die WskReceiveFromEvent Ereignisrückruffunktion in einem Datagrammsocket nicht aufruft, besteht darin, die WskReceiveFromEvent Ereignisrückruffunktion der Anwendung im Socket zu deaktivieren.

Wenn die WskReceiveFrom-Funktion STATUS_PENDING zurückgibt, muss die in der WSK_BUF-Struktur beschriebene MDL-Kette, auf die der parameter Buffer verweist, im Arbeitsspeicher bleiben, bis das IRP abgeschlossen ist. Darüber hinaus muss die Variable, auf die durch den ControlInfoLength Parameter verwiesen wird, der Puffer, auf den der parameter ControlInfo verweist, und die Variable, auf die durch den ControlFlags Parameter verwiesen wird, auch gültig bleiben, bis der IRP abgeschlossen ist. Wenn die WSK-Anwendung diese Puffer oder Variablen mit einer der ExAllocateXxx--Funktionen zugewiesen hat, kann der Speicher nicht mit der entsprechenden ExFreeXxx--Funktion freigegeben werden, bis die IRP abgeschlossen ist. Wenn die WSK-Anwendung diese Puffer oder Variablen auf dem Stapel zugeordnet hat, kann sie nicht von der Funktion zurückgegeben werden, die die WskReceiveFrom-Funktion aufruft, bis die IRP abgeschlossen wurde.

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

CMSGHDR-

SIO_WSK_SET_REMOTE_ADDRESS

SOCKADDR-

WSK_BUF

WSK_PROVIDER_DATAGRAM_DISPATCH

WSK_SOCKET

WskCloseSocket

WskControlSocket-

WskReceiveFromEvent

WskSendTo