Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Auswahlfunktion bestimmt den Status eines oder mehrerer Sockets, die bei Bedarf warten, um synchrone E/A auszuführen.
Syntax
int WSAAPI select(
[in] int nfds,
[in, out] fd_set *readfds,
[in, out] fd_set *writefds,
[in, out] fd_set *exceptfds,
[in] const timeval *timeout
);
Die Parameter
[in] nfds
Ignoriert. Der nfds-Parameter ist nur zur Kompatibilität mit Berkeley-Sockets enthalten.
[in, out] readfds
Ein optionaler Zeiger auf eine Reihe von Sockets, die auf Lesbarkeit überprüft werden sollen.
[in, out] writefds
Ein optionaler Zeiger auf eine Reihe von Sockets, die auf Schreibbarkeit überprüft werden sollen.
[in, out] exceptfds
Ein optionaler Zeiger auf eine Reihe von Sockets, die auf Fehler überprüft werden sollen.
[in] timeout
Die maximale Wartezeit für die Auswahl , die in Form einer TIMEVAL-Struktur bereitgestellt wird. Legen Sie den Timeoutparameter für Blockierungsvorgänge auf NULL fest.
Rückgabewert
Die Auswahlfunktion gibt die Gesamtanzahl der Socketziehpunkte zurück, die bereit sind und in den fd_set Strukturen enthalten sind, null, wenn das Zeitlimit abgelaufen ist, oder SOCKET_ERROR, wenn ein Fehler aufgetreten ist. Wenn der Rückgabewert SOCKET_ERROR ist, kann WSAGetLastError verwendet werden, um einen bestimmten Fehlercode abzurufen.
| Fehlercode | Bedeutung |
|---|---|
| Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
| Die Windows Sockets-Implementierung konnte keine erforderlichen Ressourcen für ihre internen Vorgänge zuordnen, oder die Readfds, writefds, exceptfds oder Timeval-Parameter sind nicht Teil des Benutzeradressraums. | |
| Fehler des Netzwerksubsystems. | |
| WSAEINVAL wird zurückgegeben, wenn der Timeoutwert ungültig ist oder alle drei Deskriptorparameter entweder Nullzeiger oder gültige Zeiger sind, um fd_set Strukturen zu leeren , die keine Sockets enthalten. | |
| Ein blockierter Windows Socket 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen. | |
| Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion. | |
| Einer der Deskriptorsätze enthält einen Eintrag, der kein Socket ist. |
Bemerkungen
Die Auswahlfunktion wird verwendet, um den Status eines oder mehrerer Sockets zu bestimmen. Für jeden Socket kann der Aufrufer Informationen zum Lesen, Schreiben oder Fehlerstatus anfordern. Der Satz von Sockets, für die ein bestimmter Status angefordert wird, wird durch eine fd_set Struktur angegeben. Die in den fd_set Strukturen enthaltenen Sockets müssen einem einzelnen Dienstanbieter zugeordnet werden. Für diese Einschränkung gelten Sockets als vom gleichen Dienstanbieter, wenn die WSAPROTOCOL_INFO Strukturen, die ihre Protokolle beschreiben, denselben ProviderId-Wert aufweisen. Nach der Rückgabe werden die Strukturen aktualisiert, um die Teilmenge dieser Sockets widerzuspiegeln, die die angegebene Bedingung erfüllen. Die Auswahlfunktion gibt die Anzahl der Sockets zurück, die die Bedingungen erfüllen. Es wird eine Reihe von Makros zum Bearbeiten einer fd_set Struktur bereitgestellt. Diese Makros sind mit denen kompatibel, die in der Berkeley-Software verwendet werden, aber die zugrunde liegende Darstellung ist völlig anders.
Die Parameterlesevorgänge identifizieren die Sockets, die auf Lesbarkeit überprüft werden sollen. Wenn sich der Socket derzeit im Listenzustand befindet, wird er als lesbar markiert, wenn eine eingehende Verbindungsanforderung empfangen wurde, sodass eine Annahme garantiert ohne Blockierung abgeschlossen werden kann. Bei anderen Sockets bedeutet die Lesbarkeit, dass in die Warteschlange eingereihte Daten zum Lesen verfügbar sind, sodass ein Aufruf von recv, WSARecv, WSARecvFrom oder recvfrom garantiert nicht blockiert wird.
Für verbindungsorientierte Sockets kann die Lesbarkeit auch angeben, dass eine Anforderung zum Schließen des Sockets vom Peer empfangen wurde. Wenn der virtuelle Schaltkreis ordnungsgemäß geschlossen wurde und alle Daten empfangen wurden, wird ein Recv sofort mit null Bytes zurückgegeben. Wenn der virtuelle Schaltkreis zurückgesetzt wurde, wird ein Recv sofort mit einem Fehlercode wie WSAECONNRESET abgeschlossen. Das Vorhandensein von OOB-Daten wird überprüft, wenn die Socketoption SO_OOBINLINE aktiviert wurde (siehe Setsockopt).
Der Parameter writefds identifiziert die Sockets, die zur Schreibbarkeit überprüft werden sollen. Wenn ein Socket einen Verbindungsaufruf verarbeitet (Nichtblocking), kann ein Socket schreibbar sein, wenn die Verbindungseinrichtung erfolgreich abgeschlossen wurde. Wenn der Socket keinen Verbindungsaufruf verarbeitet, bedeutet die Schreibbarkeit, dass ein Sende-, Sende- oder WSASendto-Vorgang erfolgreich ist. Sie können jedoch für einen Blockierungssocket blockieren, wenn der Len-Parameter den verfügbaren Speicherplatz des ausgehenden Systempuffers überschreitet. Es wird nicht angegeben, wie lange diese Garantien gelten können, insbesondere in einer Multithreadumgebung.
Der Parameter mit Ausnahme vonfds identifiziert die Sockets, die auf das Vorhandensein von OOB-Daten oder auf außergewöhnliche Fehlerbedingungen überprüft werden sollen.
Zusammenfassend wird ein Socket in einem bestimmten Satz identifiziert, wenn die Auswahl zurückgegeben wird, wenn:
Readfds:
- Wenn die Überwachung aufgerufen wurde und eine Verbindung aussteht, wird die Annahme erfolgreich ausgeführt.
- Daten stehen zum Lesen zur Verfügung (einschließlich OOB-Daten, wenn SO_OOBINLINE aktiviert ist).
- Die Verbindung wurde geschlossen/zurückgesetzt/beendet.
- Bei der Verarbeitung eines Verbindungsaufrufs (nicht blockierend) ist die Verbindung erfolgreich.
- Daten können gesendet werden.
- Bei der Verarbeitung eines Verbindungsaufrufs (nicht blockierend) ist ein Verbindungsversuch fehlgeschlagen.
- OOB-Daten sind zum Lesen verfügbar (nur wenn SO_OOBINLINE deaktiviert ist).
- FD_ZERO(*set) – Initialisiert auf den leeren Satz. Vor der Verwendung sollte immer ein Satz gelöscht werden.
- FD_CLR(n; *set) – Entfernt Sockets aus dem Satz.
- FD_ISSET(n; *set) – Überprüft, ob es sich bei s um ein Element des Satzes handelt, und gibt "TRUE" zurück, falls dies der Fall ist.
- FD_SET(n; *set) – Fügt sockets hinzu, die festgelegt werden sollen.
Mit dem Parametertimeout wird gesteuert, wie lange die Auswahl abgeschlossen werden kann. Wenn timeout ein Nullzeiger ist, wird die Auswahl unbegrenzt blockiert, bis mindestens ein Deskriptor die angegebenen Kriterien erfüllt. Andernfalls verweist timeout auf eine TIMEVAL-Struktur, die die maximale Zeit angibt, die ausgewählt werden soll, bevor sie zurückgegeben wird. Wenn die Auswahl zurückgegeben wird, werden die Inhalte der TIMEVAL-Struktur nicht geändert. Wenn TIMEVAL auf {0, 0} initialisiert wird, wird die Auswahl sofort zurückgegeben. Dies wird verwendet, um den Status der ausgewählten Sockets abzufragen. Wenn die Auswahl sofort zurückgegeben wird, gilt der auswahlaufruf als nicht blockierend, und die Standardannahmen für nicht blockierende Anrufe gelten. Beispielsweise wird der Blockierungshaken nicht aufgerufen, und Windows-Sockets führen nicht zu einer Ausbeute.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Anforderungen
| Anforderung | Wert |
|---|---|
| Mindestens unterstützter Client | Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps] |
| Mindestanforderungen für unterstützte Server | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
| Zielplattform | Fenster |
| Header | winsock2.h |
| Library | Ws2_32.lib |
| DLL | Ws2_32.dll |