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
WSANOTINITIALISIERT
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAEFAULT
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.
WSAENETDOWN
Beim Netzwerksubsystem ist ein Fehler aufgetreten.
WSAEINVAL
Der Timeoutwert ist ungültig, oder alle drei Deskriptorparameter waren NULL.
WSAEINTR
Ein blockierender Windows Socket 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAENOTSOCK
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.

Hinweis Out-of-Band-Daten werden nur dann auf diese Weise gemeldet, wenn die Option SO_OOBINLINE FALSE ist. Wenn ein Socket einen Verbindungsaufruf verarbeitet (nonblocking), wird ein Fehler des Verbindungsversuchs in exceptfds angezeigt (die Anwendung muss dann getsockopt SO_ERROR aufrufen, um den Fehlerwert zu ermitteln, um zu beschreiben, warum der Fehler aufgetreten ist). In diesem Dokument wird nicht definiert, welche anderen Fehler enthalten sind.
 
Zwei beliebige Parameter, readfds, writefds oder exceptfds, können als NULL angegeben werden. Mindestens eins muss nicht NULL sein, und jeder Nicht-NULL-Deskriptorsatz muss mindestens ein Handle für einen Socket enthalten.

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.
writefds:
  • Wenn sie einen Verbindungsaufruf verarbeiten (nonblocking), ist die Verbindung erfolgreich.
  • Daten können gesendet werden.
exceptfds:
  • Beim Verarbeiten eines Verbindungsaufrufs (nonblocking) ist der Verbindungsversuch fehlgeschlagen.
  • OOB-Daten stehen zum Lesen zur Verfügung (nur, wenn SO_OOBINLINE deaktiviert ist).
Vier Makros sind in der Headerdatei Winsock2.h zum Bearbeiten und Überprüfen der Deskriptorsätze definiert. Die Variable FD_SETSIZE bestimmt die maximale Anzahl von Deskriptoren in einem Satz. (Der Standardwert von FD_SETSIZE ist 64. Dieser Wert kann geändert werden, indem FD_SETSIZE in einen anderen Wert definiert wird, bevor Winsock2.h eingeschlossen wird.) Intern werden Sockethandles in einer fd_set-Struktur nicht als Bitflags wie in Berkeley Unix dargestellt. Ihre Datendarstellung ist undurchsichtig. Die Verwendung dieser Makros ermöglicht die Softwareportabilität zwischen verschiedenen Socketumgebungen. Die Makros zum Bearbeiten und Überprüfen fd_set Inhalten sind:
  • 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.

Hinweis Die Select-Funktion hat keine Auswirkungen auf die Persistenz von Socketereignissen, die bei WSAAsyncSelect oder WSAEventSelect registriert sind.
 
Hinweis Wenn Sie einen blockierenden Winsock-Aufruf ausstellen, z. B . auswählen , wobei der Timeoutparameter auf NULL festgelegt ist, muss Winsock möglicherweise auf ein Netzwerkereignis warten, bevor der Aufruf abgeschlossen werden kann. Winsock führt in dieser Situation eine warnbare Wartezeit aus, die durch einen asynchronen Prozeduraufruf (APC) unterbrochen werden kann, der für denselben Thread geplant ist. Das Ausgeben eines weiteren blockierenden Winsock-Aufrufs in einem APC, der einen fortlaufenden blockierenden Winsock-Aufruf im selben Thread unterbrochen hat, führt zu nicht definiertem Verhalten und darf niemals von Winsock-Clients versucht werden.
 
Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps auf Windows Phone 8 und höher unterstützt.

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

Weitere Informationen

TIMEVAL

WSAAsyncWählen

WSAEventSelect

Winsock-Funktionen

Winsock-Referenz

Akzeptieren

connect

Recv

recvfrom

send