LPWSPEVENTSELECT-Rückruffunktion (ws2spi.h)

Die LPWSPEventSelect--Funktion gibt ein Ereignisobjekt an, das dem angegebenen Satz von Netzwerkereignissen zugeordnet werden soll.

Syntax

LPWSPEVENTSELECT Lpwspeventselect;

int Lpwspeventselect(
  [in]  SOCKET s,
  [in]  WSAEVENT hEventObject,
  [in]  long lNetworkEvents,
  [out] LPINT lpErrno
)
{...}

Parameter

[in] s

Ein Deskriptor, der den Socket identifiziert.

[in] hEventObject

Das Handle, mit dem das Ereignisobjekt identifiziert wird, das der angegebenen Gruppe von Netzwerkereignissen zugeordnet werden soll.

[in] lNetworkEvents

Eine Bitmaske, die die Kombination von Netzwerkereignissen angibt, in denen der Windows Sockets SPI-Client Interesse hat. Erstellt mithilfe des bitweisen OR-Operators mit einem dieser Werte.

Wert Bedeutung
FD_READ
Probleme bei der Benachrichtigung über die Bereitschaft zum Lesen.
FD_WRITE
Gibt die Benachrichtigung über die Bereitschaft zum Schreiben aus.
FD_OOB
Gibt die Benachrichtigung über das Eintreffen von OOB-Daten aus.
FD_ACCEPT
Probleme bei der Benachrichtigung über eingehende Verbindungen.
FD_CONNECT
Probleme bei der Benachrichtigung über die abgeschlossene Verbindung.
FD_CLOSE
Gibt die Benachrichtigung über das Schließen des Sockets an.
FD_QOS
Gibt die Benachrichtigung über Socketänderungen (QoS) aus.
FD_GROUP_QOS
Reserviert.
FD_ROUTING_INTERFACE_CHANGE
Gibt die Benachrichtigung über Änderungen der Routingschnittstelle für die angegebenen Ziel(n) aus.
FD_ADDRESS_LIST_CHANGE
Probleme bei der Benachrichtigung über Änderungen an der lokalen Adressliste für die Adressfamilie des Sockets.

[out] lpErrno

Ein Zeiger auf den Fehlercode. Weitere Informationen finden Sie im Abschnitt Rückgabewert.

Rückgabewert

Der Rückgabewert ist null, wenn die Spezifikation des Windows Sockets SPI-Clients für netzwerkereignisse und das zugeordnete Ereignisobjekt erfolgreich war. Andernfalls wird der wert SOCKET_ERROR zurückgegeben, und eine bestimmte Fehlernummer ist in lpErrnoverfügbar.

Fehlercode Bedeutung
WSAENETDOWN-
Fehler des Netzwerksubsystems.
WSAEINVAL-
Gibt an, dass einer der angegebenen Parameter ungültig war oder sich der angegebene Socket in einem ungültigen Zustand befindet.
WSAEINPROGRESS-
Das Blockieren des Windows Sockets-Aufrufs wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAENOTSOCK
Der Deskriptor ist kein Socket.

Bemerkungen

Diese Funktion wird verwendet, um ein Ereignisobjekt hEventObject-anzugeben, das den ausgewählten Netzwerkereignissen zugeordnet werden soll, lNetworkEvents. Der Socket, für den ein Ereignisobjekt angegeben wird, wird durch sidentifiziert. Das Ereignisobjekt wird festgelegt, wenn eines der nominierten Netzwerkereignisse auftritt.

LPWSPEventSelect funktioniert sehr ähnlich wie LPWSPAsyncSelect, wobei sich der Unterschied in den Aktionen befindet, die ausgeführt werden, wenn ein nominiertes Netzwerkereignis auftritt. Während WSPAsyncSelect- bewirkt, dass eine vom Windows Sockets SPI angegebene Windows-Nachricht veröffentlicht wird, legt LPWSPEventSelect das zugeordnete Ereignisobjekt fest und zeichnet das Auftreten dieses Ereignisses in einem internen Netzwerkereignisdatensatz auf. Ein Windows Sockets SPI-Client kann LPWSPEnumNetworkEvents verwenden, um den Inhalt des internen Netzwerkereignisdatensatzes abzurufen und somit zu bestimmen, welche der nominierten Netzwerkereignisse aufgetreten sind.

LPWSPEventSelect ist die einzige Funktion, die bewirkt, dass Netzwerkaktivitäten und Fehler über LPWSPEnumNetworkEventsaufgezeichnet und abgerufen werden können. In den Beschreibungen LPWSPSelect- und LPWSPAsyncSelect- erfahren Sie, wie diese Funktionen Netzwerkaktivitäten und Fehler melden.

Diese Funktion legt socket s automatisch auf den Nichtblockierungsmodus fest, unabhängig vom Wert von lNetworkEvents.

Wenn Sie eine LPWSPEventSelect- für einen Socket ausgeben, werden alle vorherigen LPWSPAsyncSelect- oder LPWSPEventSelect- für denselben Socket abgebrochen und der interne Netzwerkereignisdatensatz gelöscht. Um beispielsweise ein Ereignisobjekt sowohl Lese- als auch Schreibnetzwerkereignissen zuzuordnen, muss der Windows Sockets SPI-Client LPWSPEventSelect- sowohl mit FD_READ als auch mit FD_WRITE aufrufen.

rc = WSPEventSelect(s, hEventObject, FD_READ | FD_WRITE);

Es ist nicht möglich, unterschiedliche Ereignisobjekte für unterschiedliche Netzwerkereignisse anzugeben. Der folgende Code funktioniert nicht. Der zweite Aufruf bricht die Auswirkungen des ersten ab, und die einzige Zuordnung ist das FD_WRITE Netzwerkereignis, das hEventObject2 zugeordnet ist.

// Incorrect example.
rc = WSPEventSelect(s, hEventObject1, FD_READ);
rc = WSPEventSelect(s, hEventObject2, FD_WRITE);

Um die Zuordnung und Auswahl von Netzwerkereignissen in einem Socket abzubrechen, sollten Sie lNetworkEvents auf Null festlegen, in diesem Fall wird der hEventObject Parameter ignoriert.

rc = WSPEventSelect(s, hEventObject, 0);

Durch schließen eines Sockets mit LPWSPCloseSocket wird auch die Zuordnung und Auswahl von Netzwerkereignissen abgebrochen, die in LPWSPEventSelect- für den Socket angegeben sind. Der Windows Sockets SPI-Client muss jedoch weiterhin WSACloseEvent- aufrufen, um das Ereignisobjekt explizit zu schließen und alle Ressourcen freizugeben.

Da ein LPWSPAccept"ed socket" die gleichen Eigenschaften wie der zum Akzeptieren verwendete Überwachungssocket aufweist, gelten alle LPWSPEventSelect Zuordnungs- und Netzwerkereignisauswahl für den zugelassenen Socket. Wenn ein Überwachungssocket z. B. LPWSPEventSelect Zuordnung von hEventObject mit FD_ACCEPT, FD_READ und FD_WRITE hat, verfügen alle in diesem Überwachungssocket akzeptierten Sockets auch über FD_ACCEPT, FD_READ und FD_WRITE Netzwerkereignisse, die demselben hEventObject-zugeordnet sind. Wenn ein anderer hEventObject oder Netzwerkereignisse gewünscht wird, sollte der WINDOWS Sockets SPI-Client LPWSPEventSelectaufrufen, den akzeptierten Socket übergeben und die gewünschten neuen Informationen.

Nachdem das Auftreten des Netzwerkereignisses erfolgreich aufgezeichnet und das zugeordnete Ereignisobjekt signalisiert wurde, werden keine weiteren Aktionen für dieses Netzwerkereignis ausgeführt, bis der Windows Sockets SPI-Client den Funktionsaufruf durchführt, der implizit die Einstellung dieses Netzwerkereignisses und die Signalisierung des zugeordneten Ereignisobjekts aktiviert.

Netzwerkereignis Erneute Aktivierungsfunktion
FD_READ LPWSPRecv oder LPWSPRecvFrom
FD_WRITE LPWSPSend oder LPWSPSendTo
FD_OOB LPWSPRecv oder LPWSPRecvFrom
FD_ACCEPT LPWSPAccept, es sei denn, der zurückgegebene Fehlercode ist WSATRY_AGAIN, der angibt, dass die Bedingungsfunktion CF_DEFER
FD_CONNECT NICHTS
FD_CLOSE NICHTS
FD_QOS LPWSPIoctl mit SIO_GET_QOS
FD_GROUP_QOS Reserviert für zukünftige Verwendung mit Socketgruppen: LPWSPIoctl mit SIO_GET_GROUP_QOS
FD_ROUTING_INTERFACE_CHANGE LPWSPIoctl mit Befehl SIO_ROUTING_INTERFACE_CHANGE
FD_ADDRESS_LIST_CHANGE LPWSPIoctl mit Befehl SIO_ADDRESS_LIST_CHANGE

Jeder Aufruf der reaktivierenden Routine, auch eines, das fehlschlägt, führt dazu, dass die Aufzeichnung bzw. das Signal für das entsprechende Netzwerkereignis- bzw. Ereignisobjekt erneut aktiviert wird.

Für FD_READ, FD_OOB und FD_ACCEPT Netzwerkereignisse werden Die Signalisierung von Netzwerkereignissen und Ereignisobjektsignalen ausgelöst. Dies bedeutet, dass das Netzwerkereignis aufgezeichnet und das zugeordnete Ereignisobjekt signalisiert wird, wenn die erneute Aktivierungsroutine aufgerufen wird und die entsprechende Netzwerkbedingung nach dem Aufruf noch gültig ist. Auf diese Weise kann ein Windows Sockets SPI-Client ereignisgesteuert sein und gleichzeitig nicht mit der Datenmenge in Verbindung stehen, die jederzeit eintreffen. Betrachten Sie die folgende Sequenz.

  1. Der Dienstanbieter empfängt 100 Byte Daten für socket s, zeichnet das FD_READ Netzwerkereignis auf und signalisiert das zugeordnete Ereignisobjekt.
  2. Der Windows Sockets SPI-Client gibt WSPRecv(s, buffptr, 50, 0) Lesevorgänge von 50 Byte aus.
  3. Der Dienstanbieter zeichnet das FD_READ Netzwerkereignis auf und signalisiert das zugeordnete Ereignisobjekt erneut, da noch Daten gelesen werden sollen.

Mit dieser Semantik muss ein Windows Sockets SPI-Client nicht alle verfügbaren Daten als Reaktion auf ein FD_READ Netzwerkereignis lesen. Stattdessen ist eine einzelne LPWSPRecv- als Reaktion auf jedes FD_READ Netzwerkereignis geeignet.

Die ereignisse FD_QOS und FD_GROUP_QOS gelten als edgeauslösten. Eine Nachricht wird genau einmal veröffentlicht, wenn sich eine QOS-Änderung (Quality of Service) ändert. Weitere Hinweise werden erst ausgegeben, wenn der Dienstanbieter eine weitere Änderung in QOS erkennt oder der Windows Sockets SPI-Client das QOS für den Socket umverhandelt.

Die ereignisse FD_ROUTING_INTERFACE_CHANGE und FD_ADDRESS_LIST_CHANGE gelten auch als edgeauslöste. Eine Nachricht wird genau veröffentlicht, wenn eine Änderung erfolgt, nachdem der Windows Sockets SPI-Client die Benachrichtigung angefordert hat, indem WSAIoctl- mit SIO_ROUTING_INTERFACE_CHANGE oder SIO_ADDRESS_LIST_CHANGE entsprechend ausgegeben wird. Weitere Meldungen werden erst angezeigt, wenn der Windows Sockets SPI-Client die IOCTL-neu erstellt und eine weitere Änderung erkannt wird, seit die IOCTL ausgestellt wurde.

Wenn bereits ein Netzwerkereignis aufgetreten ist, wenn der Windows Sockets SPI-Client LPWSPEventSelect-aufruft oder wenn die erneute Aktivierungsfunktion aufgerufen wird, wird ein Netzwerkereignis aufgezeichnet, und das zugeordnete Ereignisobjekt wird entsprechend signalisiert. Betrachten Sie z. B. die folgende Sequenz.

  1. Ein WINDOWS Sockets SPI-Client ruft LPWSPListen-auf.
  2. Eine Verbindungsanforderung wird empfangen, aber noch nicht akzeptiert.
  3. Der WINDOWS Sockets SPI-Client ruft LPWSPEventSelect an, der an dem FD_ACCEPT Netzwerkereignis für den Socket interessiert ist. Der Dienstanbieter zeichnet das FD_ACCEPT Netzwerkereignis auf und signalisiert das zugeordnete Ereignisobjekt sofort.

Das FD_WRITE Netzwerkereignis wird etwas anders behandelt. Ein FD_WRITE Netzwerkereignis wird aufgezeichnet, wenn ein Socket zum ersten Mal mit LPWSPConnect- verbunden oder mit LPWSPAcceptakzeptiert wird, und nachdem ein LPWSPSend oder LPWSPSendTo mit WSAEWOULDBLOCK fehlschlägt und Pufferspeicher verfügbar wird. Daher kann ein Windows Sockets SPI-Client davon ausgehen, dass Sendedaten von der ersten FD_WRITE Netzwerkereigniseinstellung und dauerhaft bis zum Zurückgeben von WSAEWOULDBLOCK möglich sind. Nach einem solchen Fehler wird der Windows Sockets SPI-Client feststellen, dass sendevorgangs erneut möglich sind, wenn ein FD_WRITE Netzwerkereignis aufgezeichnet wird und das zugeordnete Ereignisobjekt signalisiert wird.

Das FD_OOB Netzwerkereignis wird nur verwendet, wenn ein Socket so konfiguriert ist, dass out-of-Band-Daten separat empfangen werden. Wenn der Socket für den Empfang von Out-of-Band-Daten inline konfiguriert ist, werden die Out-of-Band-Daten (beschleunigte) Daten als normale Daten behandelt, und der Windows Sockets SPI-Client sollte ein Interesse daran registrieren und erhält FD_READ Netzwerkereignis, nicht FD_OOB Netzwerkereignis. Ein Windows Sockets SPI-Client kann festlegen oder prüfen, wie Out-of-Band-Daten mithilfe LPWSPSetSockOpt oder LPWSPGetSockOpt- für die option SO_OOBINLINE verarbeitet werden sollen.

Der Fehlercode in einem FD_CLOSE Netzwerkereignis gibt an, ob der Socket schließen ordnungsgemäß oder abgebrochen wurde. Wenn der Fehlercode 0 ist, war der Schließen ordnungsgemäß; wenn der Fehlercode WSAECONNRESET ist, wurde der virtuelle Schaltkreis des Sockets zurückgesetzt. Dies gilt nur für verbindungsorientierte Sockets wie SOCK_STREAM.

Das FD_CLOSE Netzwerkereignis wird aufgezeichnet, wenn eine schließende Anzeige für den virtuellen Schaltkreis empfangen wird, der dem Socket entspricht. Dies bedeutet in TCP, dass die FD_CLOSE aufgezeichnet wird, wenn die Verbindung in den STATUS FIN WAIT oder CLOSE WAIT wechselt. Dies führt dazu, dass das Remote-Ende eine LPWSPShutdown- auf der Sendeseite oder ein LPWSPCloseSocketausführt.

A service providers should record only an FD_CLOSE network event to indicate closure of a virtual circuit; es sollte kein Aufzeichnen eines FD_READ Netzwerkereignisses, um diese Bedingung anzugeben.

Das FD_QOS- oder FD_GROUP_QOS Netzwerkereignis wird aufgezeichnet, wenn eine Änderung an einem Feld in der Flussspezifikation aufgetreten ist, die socket szugeordnet ist, oder die Socketgruppe, zu der gehört. Diese Änderung muss windows Sockets SPI Clients über die LPWSPIoctl Funktion mit SIO_GET_QOS und/oder SIO_GET_GROUP_QOS zur Verfügung gestellt werden, um das aktuelle QOS für Sockets abzurufen, oder für die Socketgruppe gehört s gehört.

Das FD_ROUTING_INTERFACE_CHANGE Netzwerkereignis wird aufgezeichnet, wenn die lokale Schnittstelle, die verwendet werden soll, um das in WSAIoctl angegebene Ziel zu erreichen, mit SIO_ROUTING_INTERFACE_CHANGE Änderungen , nachdem diese IOCTL ausgestellt wurde.

Das FD_ADDRESS_LIST_CHANGE Netzwerkereignis wird aufgezeichnet, wenn die Liste der Adressen der Sockets-Protokollfamilie, an die der Windows Sockets SPI-Client Änderungen binden kann, nachdemWSAIoctl mit SIO_ADDRESS_LIST_CHANGE ausgestellt wurde.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 10 Build 20348
mindestens unterstützte Server- Windows 10 Build 20348
Header- ws2spi.h

Siehe auch

LPWSPEnumNetworkEvents