LPWSPASYNCSELECT-Rückruffunktion (ws2spi.h)
Die LPWSPAsyncSelect--Funktion fordert die meldungsbasierte Windows-Ereignisbenachrichtigung über Netzwerkereignisse für einen Socket an.
Syntax
LPWSPASYNCSELECT Lpwspasyncselect;
int Lpwspasyncselect(
[in] SOCKET s,
[in] HWND hWnd,
[in] unsigned int wMsg,
[in] long lEvent,
[out] LPINT lpErrno
)
{...}
Parameter
[in] s
Deskriptor, der den Socket identifiziert, für den eine Ereignisbenachrichtigung erforderlich ist.
[in] hWnd
Behandeln Sie die Identifizierung des Fensters, das eine Nachricht empfangen soll, wenn ein Netzwerkereignis auftritt.
[in] wMsg
Nachricht, die gesendet werden soll, wenn ein Netzwerkereignis auftritt.
[in] lEvent
Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen der Windows Sockets Service Provider Interface (SPI)-Client interessiert ist. Erstellt mithilfe des bitweisen OR-Operators mit einem dieser Werte.
Wert | Bedeutung |
---|---|
|
Probleme bei der Benachrichtigung über die Bereitschaft zum Lesen. |
|
Gibt die Benachrichtigung über die Bereitschaft zum Schreiben aus. |
|
Gibt die Benachrichtigung über das Eintreffen von OOB-Daten aus. |
|
Probleme bei der Benachrichtigung über eingehende Verbindungen. |
|
Probleme bei der Benachrichtigung über abgeschlossene Verbindungen. |
|
Gibt die Benachrichtigung über das Schließen des Sockets an. |
|
Probleme bei der Benachrichtigung über Änderungen an der Socketqualität des Dienstes (QoS). |
|
Reserviert. |
|
Probleme bei der Änderung der Routingschnittstelle für das angegebene Ziel. |
|
Probleme bei der Änderung der lokalen Adressliste für die Protokollfamilie des Sockets. |
[out] lpErrno
Zeigen Sie auf den Fehlercode. Weitere Informationen finden Sie im Abschnitt Rückgabewert.
Rückgabewert
Der Rückgabewert ist null, wenn die Deklaration des Windows Sockets SPI-Clients für das Netzwerkereignis erfolgreich war. Andernfalls wird der wert SOCKET_ERROR zurückgegeben, und in lpErrnoist ein bestimmter Fehlercode verfügbar.
Fehlercode | Bedeutung |
---|---|
Fehler des Netzwerksubsystems. | |
Gibt an, dass einer der angegebenen Parameter ungültig war, z. B. das Fensterhandle, das nicht auf ein vorhandenes Fenster verweist, oder der angegebene Socket in einem ungültigen Zustand ist. | |
Ein blockierter Windows Sockets-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion. | |
Der Deskriptor ist kein Socket. |
Weitere Informationen zu zusätzlichen Fehlercodes, die festgelegt werden können (im hohen Wort lParam innerhalb der Nachricht), finden Sie unter Hinweise, wenn ein Anwendungsfenster eine Nachricht empfängt.
Bemerkungen
Diese Funktion wird verwendet, um anzufordern, dass der Dienstanbieter eine Windows-Nachricht an das Fenster des Clients sendet, hWnd, wenn der Dienstanbieter eines der vom argument lEvent angegebenen Netzwerkereignisse erkennt. Der Dienstanbieter sollte die WPUPostMessage--Funktion verwenden, um die Nachricht zu posten. Die zu sendende Nachricht wird durch den wMsg Parameter angegeben. Der Socket, für den eine Benachrichtigung erforderlich ist, wird durch sidentifiziert.
Diese Funktion legt socket s automatisch auf den Nichtblockierungsmodus fest, unabhängig vom Wert von lEvent. Informationen zum Zurücksetzen des Sockets auf den Blockierungsmodus finden Sie unter LPWSPIoctl-.
Beim Aufrufen von LPWSPAsyncSelect- für einen Socket werden alle vorherigen LPWSPAsyncSelect- oder LPWSPEventSelect- für denselben Socket abgebrochen. Um beispielsweise Benachrichtigungen für das Lesen und Schreiben zu empfangen, muss der WINDOWS Sockets SPI-Client LPWSPAsyncSelect- mit FD_READ und FD_WRITE aufrufen, wie dies der Fall ist.
rc = WSPAsyncSelect(s, hWnd, wMsg, FD_READ | FD_WRITE, &error);
Es ist nicht möglich, unterschiedliche Nachrichten für unterschiedliche Ereignisse anzugeben. Der folgende Code funktioniert nicht. Der zweite Aufruf bricht die Auswirkungen des ersten Abbruchs ab, und die einzige Zuordnung ist das FD_WRITE Ereignis, das wMsg2 zugeordnet ist.
// Incorrect example.
rc = WSPAsyncSelect(s, hWnd, wMsg1, FD_READ, &error);
rc = WSPAsyncSelect(s, hWnd, wMsg2, FD_WRITE, &error);
Um alle Benachrichtigungen abzubrechen (d. h. um anzugeben, dass der Dienstanbieter keine weiteren Nachrichten im Zusammenhang mit Netzwerkereignissen im Socket senden soll), legen Sie lEvent- auf Null fest.
rc = WSPAsyncSelect(s, hWnd, 0, 0, &error);
Da ein LPWSPAccept-"ed socket" die gleichen Eigenschaften wie der zum Akzeptieren verwendete Überwachungssocket aufweist, gelten alle LPWSPAsyncSelect- Für den akzeptierten Socket festgelegte Ereignisse. Wenn ein Überwachungssocket z. B. LPWSPAsyncSelect Ereignisse FD_ACCEPT, FD_READ und FD_WRITE hat, verfügt jeder in diesem Überwachungssocket akzeptierte Socket auch über FD_ACCEPT, FD_READ und FD_WRITE Ereignisse mit demselben wMsg Wert, der für Nachrichten verwendet wird. Wenn ein anderer wMsg oder Ereignisse gewünscht wird, sollte der WINDOWS Sockets SPI-Client LPWSPAsyncSelectaufrufen, den akzeptierten Socket übergeben und die gewünschten neuen Informationen.
Wenn eines der nominierten Netzwerkereignisse auf dem angegebenen Socket auftritt, verwendet der Dienstanbieter WPUPostMessage, um Nachrichten wMsg an das Windows Sockets SPI-Clientfenster hWndzu senden. In der geposteten Nachricht identifiziert das wParam--Argument den Socket, auf dem ein Netzwerkereignis aufgetreten ist. Das niedrige Wort von lParam gibt das aufgetretene Netzwerkereignis an. Die möglichen Netzwerkereigniscodes, die angegeben werden können, sind wie folgt.
Wert | Bedeutung |
---|---|
FD_READ | Socket s ist zum Lesen bereit. |
FD_WRITE | Socket s ist schreibbereit |
FD_OOB | Out-of-Band-Daten sind bereit zum Lesen von Sockets s |
FD_ACCEPT | Socket s ist bereit, eine neue eingehende Verbindung zu akzeptieren. |
FD_CONNECT | Die Verbindung, die auf Socket- initiiert wurde, wurde abgeschlossen. |
FD_CLOSE | Die durch Socket identifizierte Verbindung wurde geschlossen. |
FD_QOS | Die Mit Socket s verbundene Dienstqualität hat sich geändert. |
FD_GROUP_QOS | Reserviert für die zukünftige Verwendung mit Socketgruppen: Die Dienstqualität, die der Socketgruppe zugeordnet ist, zu der s gehört, wurde geändert. |
FD_ROUTING_INTERFACE_CHANGE | Die lokale Schnittstelle, die zum Senden an das angegebene Ziel verwendet werden soll, wurde geändert. |
FD_ADDRESS_LIST_CHANGE | Die Liste der Adressen der Protokollfamilie des Sockets, an die der Windows Sockets SPI-Client gebunden werden kann, wurde geändert. |
Das high word of lParam contains any error code (it can be extracted by using the WSAGETSELECTERROR macro). Der Fehlercode ist ein beliebiger Fehler, wie in ws2spi.h
definiert. Mögliche Fehlercodes für jedes Netzwerkereignis sind in der folgenden Tabelle aufgeführt.
Ereignis: FD_CONNECT
Fehlercode | Bedeutung |
---|---|
Adressen in der angegebenen Familie können nicht mit diesem Socket verwendet werden. | |
Der Versuch, eine Verbindung herzustellen, wurde abgelehnt. | |
Das Netzwerk kann derzeit nicht von diesem Host aus erreicht werden. | |
Der namelen Parameter ist ungültig. | |
Der Socket ist bereits an eine Adresse gebunden. | |
Der Socket ist bereits verbunden. | |
Es sind keine weiteren Dateideskriptoren verfügbar. | |
Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht verbunden werden. | |
Der Socket ist nicht verbunden. | |
Versuchen Sie, einen Timeout herzustellen, ohne eine Verbindung herzustellen. |
-Ereignis: FD_CLOSE
Fehlercode | Bedeutung |
---|---|
Fehler beim Netzwerksubsystem. | |
Die Verbindung wurde von der Remoteseite zurückgesetzt. | |
Die Verbindung wurde aufgrund eines Timeouts oder eines anderen Fehlers beendet. |
Ereignis...: FD_ACCEPT, FD_ADDRESS_LIST_CHANGE, FD_GROUP_QOS, FD_OOB, FD_QOS, FD_READ, FD_WRITE
Fehlercode | Bedeutung |
---|---|
Fehler beim Netzwerksubsystem. |
-Ereignis: FD_ROUTING_INTERFACE_CHANGE
Fehlercode | Bedeutung |
---|---|
Das angegebene Ziel ist nicht mehr erreichbar. | |
Fehler beim Netzwerksubsystem. |
Obwohl LPWSPAsyncSelect- für mehrere Ereignisse aufgerufen werden kann, gibt der Dienstanbieter dieselbe Windows-Nachricht für jedes Ereignis aus.
Ein Windows Sockets 2-Anbieter sollte einen Windows Sockets SPI-Client nicht ständig mit Nachrichten für ein bestimmtes Netzwerkereignis überfluten. Nachdem sie erfolgreich eine Benachrichtigung über ein bestimmtes Ereignis in einem Windows Sockets SPI-Clientfenster veröffentlicht haben, werden keine weiteren Nachrichten für dieses Netzwerkereignis in das Windows Sockets SPI-Clientfenster gepostet, bis der Windows Sockets SPI-Client den Funktionsaufruf durchführt, der die Benachrichtigung über dieses Netzwerkereignis implizit erneut 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 reaktivierungsroutine, auch eines, das fehlschlägt, führt dazu, dass nachrichtenposting für das entsprechende Ereignis erneut aktiviert wird.
Für FD_READ- und FD_OOB- und FD_ACCEPT Ereignisse wird das Posten von Nachrichten ebeneauslösten. Dies bedeutet, dass eine LPWSPAsyncSelect- Nachricht an den Windows Sockets SPI-Client gesendet wird, wenn die erneute Aktivierungsroutine aufgerufen wird und die entsprechende Bedingung nach dem Aufruf noch erfüllt ist.
Die ereignisse FD_QOS und FD_GROUP_QOS gelten als edgeauslösten. Eine Nachricht wird genau einmal gepostet, wenn eine QOS-Änderung auftritt. Weitere Nachrichten werden erst angezeigt, wenn der Anbieter eine weitere Änderung in QOS erkennt, oder der Windows Sockets SPI-Client überschreibt das QOS für den Socket neu.
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 sendet und eine weitere Änderung erkannt wird, seit die IOCTL ausgestellt wurde.
Wenn ein Ereignis bereits aufgetreten ist, wenn der Windows Sockets SPI-Client LPWSPAsyncSelectaufruft oder wenn die erneute Aktivierungsfunktion aufgerufen wird, wird eine Meldung entsprechend veröffentlicht. Betrachten Sie z. B. die folgende Sequenz.
- Ein WINDOWS Sockets SPI-Client ruft LPWSPListen-auf.
- Eine Verbindungsanforderung wird empfangen, aber noch nicht akzeptiert.
- Der WINDOWS Sockets SPI-Client ruft
LPWSPAsyncSelect an, angibt, dass er FD_ACCEPT Nachrichten für den Socket empfangen möchte. Aufgrund der Persistenz von Ereignissen sendet der WinSock-Dienstanbieter sofort eine FD_ACCEPT Nachricht.
Das FD_WRITE-Ereignis wird etwas anders behandelt. Eine FD_WRITE Nachricht wird gepostet, wenn ein Socket zuerst mit LPWSPConnect- (nach FD_CONNECT, sofern auch registriert) oder mit LPWSPAccept-akzeptiert wird, und dann nach einem LPWSPSend- oder LPWSPSendTo mit WSAEWOULDBLOCK und Pufferspeicher verfügbar wird. Daher kann ein Windows Sockets SPI-Client davon ausgehen, dass Sendedaten von der ersten FD_WRITE Nachricht ausgehend und dauerhaft sind, bis ein Senden WSAEWOULDBLOCK zurückgibt. Nach einem solchen Fehler wird der Windows Sockets SPI-Client benachrichtigt, dass senden mit einer FD_WRITE Nachricht erneut möglich ist.
Das FD_OOB-Ereignis 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 muss ein Interesse an FD_READ Ereignissen registrieren, nicht FD_OOB Ereignisse.
Der Fehlercode in einer FD_CLOSE Meldung 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.
Die FD_CLOSE Nachricht wird gepostet, wenn eine schließende Anzeige für den virtuellen Schaltkreis empfangen wird, der dem Socket entspricht. Dies bedeutet in TCP, dass die FD_CLOSE gepostet wird, wenn die Verbindung in den Status "TIME WAIT" oder "CLOSE WAIT" wechselt. Dies führt dazu, dass das Remote-Ende eine LPWSPShutdown- auf der Sendeseite oder ein LPWSPCloseSocketausführt. Es ist richtig, dass FD_CLOSE nur gepostet werden, nachdem alle Daten aus einem Socket gelesen wurden.
Im Falle einer ordnungsgemäßen Schließung sollte der Dienstanbieter eine FD_CLOSE Nachricht senden, um das schließen des virtuellen Schaltkreises nur dann anzugeben, wenn alle empfangenen Daten gelesen wurden. Es sollte keine FD_READ Nachricht senden, um diese Bedingung anzugeben.
Die FD_QOS- oder FD_GROUP_QOS-Nachricht wird gepostet, wenn eine Änderung an einem Feld in der Flussspezifikation aufgetreten ist, die sockets szugeordnet ist, oder die Socketgruppe, zu der gehört. Der Dienstanbieter muss die für den Client verfügbaren QOS-Informationen über LPWSPIoctl mit SIO_GET_QOS und/oder SIO_GET_GROUP_QOS aktualisieren.
Die FD_ROUTING_INTERFACE_CHANGE Nachricht wird bereitgestellt, wenn die lokale Schnittstelle, die verwendet werden soll, um das ziel zu erreichen, das in LPWSPIoctl mit SIO_ROUTING_INTERFACE_CHANGE Änderungen , nachdem diese IOCTL ausgestellt wurde.
Die FD_ADDRESS_LIST_CHANGE Nachricht wird veröffentlicht, wenn die Liste der Adressen, an die der Windows Sockets SPI-Client Änderungen binden kann, nachdemLPWSPIoc tl mit SIO_ADDRESS_LIST_CHANGE ausgestellt wurde.
Hier ist eine Zusammenfassung der Ereignisse und Bedingungen für jede asynchrone Benachrichtigung.
FD_READ
- Wenn LPWSPAsyncSelect- aufgerufen wird, wenn zurzeit Daten zum Empfangen verfügbar sind.
- Wenn Daten eingehen, wenn FD_READ noch nicht gepostet.
- Nach LPWSPRecv oder LPWSPRecvFrom aufgerufen (mit oder ohne MSG_PEEK), wenn die Daten weiterhin empfangen werden können.
Wenn LPWSPSetSockOpt- SO_OOBINLINE aktiviert ist, enthält Daten sowohl normale Daten als auch OOB-Daten (Out-of-Band) in den oben genannten Instanzen.
FD_WRITE
- Wenn LPWSPAsyncSelect aufgerufen wird, ist ein LPWSPSend oder LPWSPSendTo möglich.
- Nach LPWSPConnect oder LPWSPAccept aufgerufen wird, wenn eine Verbindung hergestellt wird.
- Nach LPWSPSend oder LPWSPSendTo mit WSAEWOULDBLOCK fehlschlagen, wenn LPWSPSend oder LPWSPSendTo wahrscheinlich erfolgreich ist.
- Nach LPWSPBind auf einem verbindungslosen Socket. FD_WRITE können zu diesem Zeitpunkt (implementierungsabhängig) auftreten oder nicht. In jedem Fall ist ein verbindungsloser Socket immer schreibbar unmittelbar nach LPWSPBind.
FD_OOB (nur gültig, wenn LPWSPSetSockOpt- SO_OOBINLINE deaktiviert ist (Standard))
- Wenn LPWSPAsyncSelect- aufgerufen wird, sind OOB-Daten zurzeit für den Empfang mit dem MSG_OOB-Flag verfügbar.
- Wenn OOB-Daten eingehen, wenn FD_OOB noch nicht gepostet.
- Nachdem LPWSPRecv oder LPWSPRecvFrom mit oder ohne MSG_OOB Flag aufgerufen wird, wenn OOB-Daten weiterhin zum Empfangen verfügbar sind.
FD_ACCEPT
- Wenn LPWSPAsyncSelect aufgerufen wird, wenn derzeit eine Verbindungsanforderung zur Annahme verfügbar ist.
- Wenn eine Verbindungsanforderung eingeht, wenn FD_ACCEPT noch nicht gepostet.
- Nachdem LPWSPAccept aufgerufen wurde, steht eine weitere Verbindungsanforderung zur Annahme zur Verfügung.
FD_CONNECT
- Wenn LPWSPAsyncSelect aufgerufen wird, wenn derzeit eine Verbindung hergestellt wurde.
- Nachdem LPWSPConnect- aufgerufen wurde, wird eine Verbindung hergestellt (auch wenn LPWSPConnect sofort erfolgreich ist, wie bei einem Datagrammsocket üblich), und auch dann, wenn die Verbindung sofort fehlschlägt).
- Nachdem WSPJoinLeaf aufgerufen wurde, wird aufgerufen, wenn der Verknüpfungsvorgang abgeschlossen ist.
- Nach Verbindungwurde WSAConnectoder WSPJoinLeaf mit einem nicht blockierenden verbindungsorientierten Socket aufgerufen. Der erste Vorgang wurde mit einem bestimmten Fehler von WSAEWOULDBLOCK zurückgegeben, aber der Netzwerkvorgang ging voran. Ob der Vorgang letztendlich erfolgreich ist oder nicht, wenn das Ergebnis bestimmt wurde, FD_CONNECT geschieht. Der Client sollte den Fehlercode überprüfen, um zu ermitteln, ob das Ergebnis erfolgreich oder fehlgeschlagen war.
FD_CLOSE (gilt nur für verbindungsorientierte Sockets (z. B. SOCK_STREAM))
- Wenn LPWSPAsyncSelect aufgerufen wird, wenn die Socketverbindung geschlossen wurde.
- Nachdem das Remotesystem eine ordnungsgemäße Schließung initiiert hat, wird die FD_CLOSE erst übermittelt, wenn alle ausstehenden Daten empfangen werden können (wenn Daten empfangen wurden und warten, wenn das Remotesystem eine ordnungsgemäße Schließung initiiert, dann wird die FD_CLOSE erst übermittelt, wenn alle ausstehenden Daten gelesen wurden).
- Nachdem das lokale System eine ordnungsgemäße Schließung mit LPWSPShutdown initiiert hat und das Remotesystem mit einer End-of-Data--Benachrichtigung (z. B. TCP FIN) reagiert hat, wenn zurzeit keine Daten zum Empfangen verfügbar sind.
- Wenn das Remotesystem die Verbindung abbricht (z. B. TCP RST gesendet), und lParam- enthält den WSAECONNRESET-Fehlerwert.
FD_CLOSE wird nicht gepostet, nachdem LPWSPCloseSocket aufgerufen wurde.
FD_QOS
- Wenn LPWSPAsyncSelect aufgerufen wird, wenn das mit dem Socket verknüpfte QOS geändert wurde.
- Nach LPWSPIoctl mit SIO_GET_QOS aufgerufen wird, wenn QOS geändert wird.
FD_GROUP_QOS
Reserviert für die zukünftige Verwendung mit Socketgruppen:
- Wenn LPWSPAsyncSelect aufgerufen wird, wenn die mit dem Socket verknüpfte Gruppe QOS geändert wurde.
- Nachdem LPWSPIoc tl mit SIO_GET_GROUP_QOS aufgerufen wurde, wird QOS der Gruppe geändert.
FD_ROUTING_INTERFACE_CHANGE
- nachdem LPWSPIoctl mit SIO_ROUTING_INTERFACE_CHANGE aufgerufen wird, wenn die lokale Schnittstelle, die verwendet werden soll, um das in der IOCTL angegebene Ziel zu erreichen, geändert wird.
FD_ADDRESS_LIST_CHANGE
- after LPWSPIoctl with SIO_ADDRESS_LIST_CHANGE is called, when the list of local addresses to which the Windows Sockets SPI client can bind changes.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows 10 Build 20348 |
mindestens unterstützte Server- | Windows 10 Build 20348 |
Header- | ws2spi.h |