Funktion auswählen (winsock2.h)
Die Select-Funktion bestimmt die status eines oder mehrerer Sockets, die bei Bedarf auf die Ausführung synchroner E/A-Vorgänge wartet.
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
);
Parameter
[in] nfds
Ignoriert. Der nfds-Parameter ist nur aus Gründen der 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 einen Satz von Sockets, die auf Beschreibbarkeit ü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 Select-Funktion gibt die Gesamtzahl der Sockethandles zurück, die bereit 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 die benötigten Ressourcen für ihre internen Vorgänge nicht zuordnen, oder die Parameter readfds, writefds, exceptfds oder timeval sind nicht Teil des Benutzeradressraums. | |
Beim Netzwerksubsystem ist ein Fehler aufgetreten. | |
Der Timeoutwert ist ungültig, oder alle drei Deskriptorparameter waren NULL. | |
Ein blockierender 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. |
Hinweise
Die Select-Funktion wird verwendet, um die status eines oder mehrerer Sockets zu bestimmen. Für jeden Socket kann der Aufrufer Informationen zum Lesen, Schreiben oder Fehler status 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 sein. 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 Select-Funktion gibt die Anzahl der Sockets zurück, die die Bedingungen erfüllen. Eine Gruppe von Makros wird 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 Parameter readfds identifizieren die Sockets, die auf Lesbarkeit überprüft werden sollen. Wenn sich der Socket derzeit im Zustand "Listen" befindet, wird er als lesbar markiert, wenn eine eingehende Verbindungsanforderung empfangen wurde, sodass eine Annahme ohne Blockierung garantiert wird. Für andere Sockets bedeutet Lesbarkeit, dass Daten in der Warteschlange zum Lesen verfügbar sind, sodass ein Aufruf von recv, WSARecvFrom oder recvfrom garantiert nicht blockiert wird.
Bei verbindungsorientierten Sockets kann die Lesbarkeit auch darauf hinweisen, dass eine Anforderung zum Schließen des Sockets vom Peer empfangen wurde. Wenn die virtuelle Verbindung ordnungsgemäß geschlossen wurde und alle Daten empfangen wurden, wird ein recv sofort mit null Bytes gelesen zurückgegeben. Wenn die virtuelle Verbindung 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 auf Beschreibbarkeit überprüft werden sollen. Wenn ein Socket einen Verbindungsaufruf verarbeitet (nicht blockieren), kann ein Socket beschreibbar sein, wenn die Verbindungsherstellung erfolgreich abgeschlossen wurde. Wenn der Socket keinen Verbindungsaufruf verarbeitet, bedeutet die Schreibbarkeit, dass ein Senden, Senden oderWSASendto garantiert erfolgreich ist. Sie können jedoch auf einem blockierenden Socket blockieren, wenn der len-Parameter die menge des verfügbaren ausgehenden Systempufferspeichers überschreitet. Es ist nicht angegeben, wie lange diese Garantien insbesondere in einer Multithreadumgebung gültig sein können.
Der Parameter exceptfds identifiziert die Sockets, die auf das Vorhandensein von OOB-Daten oder auf außergewöhnliche Fehlerbedingungen überprüft werden sollen.
Zusammenfassend lässt sich sagen, dass ein Socket in einem bestimmten Satz identifiziert wird, wenn die Auswahl zurückgegeben wird, wenn:
readfds:
- Wenn listen aufgerufen wurde und eine Verbindung aussteht, ist accept erfolgreich.
- Daten stehen zum Lesen zur Verfügung (einschließlich OOB-Daten, wenn SO_OOBINLINE aktiviert ist).
- Die Verbindung wurde geschlossen/zurückgesetzt/beendet.
- Wenn sie einen Verbindungsaufruf verarbeiten (nonblocking), ist die Verbindung erfolgreich.
- Daten können gesendet werden.
- Beim Verarbeiten eines Verbindungsaufrufs (nonblocking) ist der Verbindungsversuch fehlgeschlagen.
- OOB-Daten stehen zum Lesen zur Verfügung (nur, wenn SO_OOBINLINE deaktiviert ist).
- FD_ZERO(*set) – Initialisiert die Einstellung auf den leeren Satz. Ein Satz sollte vor der Verwendung immer gelöscht werden.
- FD_CLR(s, *set) – Entfernt Sockets aus dem Satz.
- FD_ISSET(s, *set) – Überprüft, ob s ein Element von set ist, und gibt TRUE zurück, wenn dies der Fall ist.
- FD_SET(s, *set) – Fügt Sockets hinzu, die festgelegt werden sollen.
Das Parametertimeout steuert, wie lange die Auswahl dauern kann. Wenn timeout ein NULL-Zeiger ist, wird select unbegrenzt blockiert, bis mindestens ein Deskriptor die angegebenen Kriterien erfüllt. Andernfalls verweist das Timeout auf eine TIMEVAL-Struktur , die die maximale Zeit angibt, die die Auswahl vor der Rückgabe warten soll. Wenn select zurückgibt, wird der Inhalt der TIMEVAL-Struktur nicht geändert. Wenn TIMEVAL auf {0, 0} initialisiert wird, wird select sofort zurückgegeben. dies wird verwendet, um den Status der ausgewählten Sockets abzufragen. Wenn select sofort zurückgegeben wird, gilt der Select-Aufruf als nicht blockierend, und die Standardannahmen für nicht blockierende Aufrufe gelten. Beispielsweise wird der blockierende Hook nicht aufgerufen, und Windows Sockets gibt nicht ab.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Anforderungen
Unterstützte Mindestversion (Client) | Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | winsock2.h |
Bibliothek | Ws2_32.lib |
DLL | Ws2_32.dll |