Share via


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, das das Ereignisobjekt identifiziert, das dem angegebenen Satz von Netzwerkereignissen zugeordnet werden soll.

[in] lNetworkEvents

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

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

[out] lpErrno

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

Rückgabewert

Der Rückgabewert ist 0, wenn die Spezifikation der Netzwerkereignisse und des zugeordneten Ereignisobjekts durch den Windows Sockets SPI-Client erfolgreich war. Andernfalls wird der Wert SOCKET_ERROR zurückgegeben, und eine bestimmte Fehlernummer ist in lpErrno verfügbar.

Fehlercode Bedeutung
WSAENETDOWN
Beim Netzwerksubsystem ist ein Fehler aufgetreten.
WSAEINVAL
Gibt an, dass einer der angegebenen Parameter ungültig war oder dass 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.

Hinweise

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

LPWSPEventSelect funktioniert sehr ähnlich wie LPWSPAsyncSelect. Der Unterschied liegt in den Aktionen, die beim Auftreten eines nominierten Netzwerkereignisses ausgeführt werden. Während WSPAsyncSelect bewirkt, dass eine vom Windows Sockets SPI-Client 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 so zu bestimmen, welches der nominierten Netzwerkereignisse aufgetreten ist.

LPWSPEventSelect ist die einzige Funktion, die dazu führt, dass Netzwerkaktivitäten und -fehler aufgezeichnet und über LPWSPEnumNetworkEvents abgerufen werden können. In den Beschreibungen von LPWSPSelect und LPWSPAsyncSelect erfahren Sie, wie diese Funktionen Netzwerkaktivität und -fehler melden.

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

Wenn Sie einen LPWSPEventSelect für einen Socket ausgeben, werden alle vorherigen LPWSPAsyncSelect - oder LPWSPEventSelect-Elemente 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 hebt die Auswirkungen des ersten auf, 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 auf einem Socket abzubrechen, sollten Sie lNetworkEvents auf Null festlegen. In diesem Fall wird der hEventObject-Parameter ignoriert.

rc = WSPEventSelect(s, hEventObject, 0);

Das Schließen eines Sockets mit LPWSPCloseSocket bricht auch die Zuordnung und Auswahl von Netzwerkereignissen ab, 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-Socket dieselben Eigenschaften wie der für die Annahme verwendete Lauschocket aufweist, gelten alle LPWSPEventSelect-Zuordnungs - und Netzwerkereignisseauswahl für den Lauschocket auf den akzeptierten Socket. Wenn ein Abhörsocket beispielsweise über eine LPWSPEventSelect-Zuordnung von hEventObject mit FD_ACCEPT, FD_READ und FD_WRITE verfügt, verfügt jeder für diesen Socket akzeptierte Socket auch über FD_ACCEPT, FD_READ und FD_WRITE Netzwerkereignisse, die demselben hEventObject zugeordnet sind. Wenn ein anderes hEventObject - oder Netzwerkereignis gewünscht ist, sollte der Windows Sockets SPI-Client LPWSPEventSelect aufrufen und den akzeptierten Socket und die gewünschten neuen Informationen übergeben.

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

Netzwerkereignis Funktion erneut aktivieren
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 Keine
FD_CLOSE Keine
FD_QOS LPWSPIoctl mit SIO_GET_QOS
FD_GROUP_QOS Reserviert für die 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 Wiederaktivierungsroutine, auch wenn ein Fehler auftritt, führt zu einer erneuten Aktivierung der Aufzeichnung und Signalisierung für das relevante Netzwerkereignis bzw. das entsprechende Ereignisobjekt.

Für FD_READ, FD_OOB und FD_ACCEPT Netzwerkereignisse werden die Netzwerkereignisaufzeichnung und die Ereignisobjektsignalisierung pegelausgelöst. Dies bedeutet, dass das Netzwerkereignis aufgezeichnet und das zugehörige Ereignisobjekt signalisiert wird, wenn die erneute Aktivierungsroutine aufgerufen wird und die relevante Netzwerkbedingung nach dem Aufruf weiterhin gültig ist. Dadurch kann ein Windows Sockets SPI-Client ereignisgesteuert sein und gleichzeitig nicht mit der Datenmenge in Verbindung stehen, die gleichzeitig eintrifft. Gehen Sie dabei von der folgenden Abfolge aus.

  1. Der Dienstanbieter empfängt 100 Bytes Daten auf Sockets, zeichnet das FD_READ Netzwerkereignis auf und signalisiert das zugehörige Ereignisobjekt.
  2. Der Windows Sockets SPI-Client hat Probleme WSPRecv(s, buffptr, 50, 0) beim Lesen von 50 Bytes.
  3. Der Dienstanbieter zeichnet das FD_READ Netzwerkereignis auf und signalisiert das zugeordnete Ereignisobjekt erneut, da noch Daten gelesen werden müssen.

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

Die FD_QOS- und FD_GROUP_QOS-Ereignisse gelten als edgetriggeriert. Eine Nachricht wird genau einmal gesendet, wenn eine QOS-Änderung (Quality of Service) auftritt. Weitere Hinweise werden erst ausgegeben, wenn der Dienstanbieter eine weitere Änderung in QOS erkennt oder der SPI-Client von Windows Sockets die QOS für den Socket neu aushandelt.

Die ereignisse FD_ROUTING_INTERFACE_CHANGE und FD_ADDRESS_LIST_CHANGE werden ebenfalls als edgeauslöst betrachtet. Eine Meldung wird genau dann gesendet, wenn eine Änderung eintritt, nachdem der Windows Sockets SPI-Client die Benachrichtigung angefordert hat, indem er WSAIoctl mit SIO_ROUTING_INTERFACE_CHANGE oder SIO_ADDRESS_LIST_CHANGE entsprechend ausgibt. Weitere Meldungen werden erst angezeigt, wenn der SPI-Client von Windows Sockets die IOCTL erneut ausstellt und seit der IOCTL eine weitere Änderung erkannt wird.

Wenn bereits ein Netzwerkereignis aufgetreten ist, wenn der Windows Sockets SPI-Client LPWSPEventSelect aufruft, oder wenn die Funktion zum erneuten Aktivieren aufgerufen wird, wird ein Netzwerkereignis aufgezeichnet, und das zugeordnete Ereignisobjekt wird entsprechend signalisiert. Betrachten Sie beispielsweise 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 auf und gibt an, dass er am FD_ACCEPT Netzwerkereignis für den Socket interessiert ist. Der Dienstanbieter zeichnet das FD_ACCEPT Netzwerkereignis auf und signalisiert sofort das zugeordnete Ereignisobjekt.

Das FD_WRITE-Netzwerkereignis wird etwas anders behandelt. Ein FD_WRITE Netzwerkereignis wird aufgezeichnet, wenn ein Socket zuerst mit LPWSPConnect verbunden oder mit LPWSPAccept akzeptiert wird, und dann, nachdem ein LPWSPSend oder LPWSPSendTo mit WSAEWOULDBLOCK fehlschlägt und Pufferspeicher verfügbar ist. Daher kann ein SPI-Client von Windows Sockets davon ausgehen, dass Senden ab der ersten FD_WRITE Netzwerkereigniseinstellung möglich sind und dauern, bis ein Sendevorgang WSAEWOULDBLOCK zurückgibt. Nach einem solchen Fehler wird der SPI-Client von Windows Sockets feststellen, dass Die Senden wieder möglich sind, wenn ein FD_WRITE Netzwerkereignis aufgezeichnet und das zugehörige Ereignisobjekt signalisiert wird.

Das FD_OOB Netzwerkereignis wird nur verwendet, wenn ein Socket für den getrennten Empfang von Out-of-Band-Daten konfiguriert ist. Wenn der Socket für den Inlineempfang von Out-of-Band-Daten konfiguriert ist, werden die Out-of-Band-Daten (beschleunigte Daten) wie normale Daten behandelt, und der SPI-Client von Windows Sockets sollte ein Interesse an FD_READ Netzwerkereignis und nicht an FD_OOB Netzwerkereignis registrieren. Ein Spi-Client für Windows Sockets kann festlegen oder überprüfen, wie Out-of-Band-Daten verarbeitet werden sollen, indem lpWSPSetSockOpt oder LPWSPGetSockOpt für die option SO_OOBINLINE verwendet werden soll.

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

Das FD_CLOSE Netzwerkereignis wird aufgezeichnet, wenn für die virtuelle Verbindung, die dem Socket entspricht, ein Close-Hinweis empfangen wird. In TCP bedeutet dies, dass die FD_CLOSE aufgezeichnet wird, wenn die Verbindung in den ZUSTAND FIN WAIT oder CLOSE WAIT wechselt. Dies ergibt sich daraus, dass das Remote-Ende einen LPWSPShutdown auf der Sendeseite oder ein LPWSPCloseSocket ausführt.

Ein Dienstanbieter sollte nur ein FD_CLOSE Netzwerkereignis aufzeichnen, um auf das Schließen einer virtuellen Verbindung hinzuweisen. Es sollte kein FD_READ Netzwerkereignis aufzeichnen, um diese Bedingung anzugeben.

Das FD_QOS oder FD_GROUP_QOS Netzwerkereignis wird aufgezeichnet, wenn eine Änderung an einem Feld in der Flowspezifikation vorgenommen wurde, die Sockets zugeordnet ist, bzw. der Socketgruppe, zu der s 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 bzw. für die Socketgruppe abzurufen, zu der 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 mit SIO_ROUTING_INTERFACE_CHANGE Änderungen zu erreichen, nachdem eine solche IOCTL ausgestellt wurde.

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

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 10 Build 20348
Unterstützte Mindestversion (Server) Windows 10 Build 20348
Kopfzeile ws2spi.h

Weitere Informationen

LPWSPEnumNetworkEvents