Share via


LPWSPSELECT-Rückruffunktion (ws2spi.h)

Die LPWSPSelect-Funktion bestimmt die status eines oder mehrerer Sockets.

Syntax

LPWSPSELECT Lpwspselect;

int Lpwspselect(
  [in]      int nfds,
  [in, out] fd_set *readfds,
  [in, out] fd_set *writefds,
  [in, out] fd_set *exceptfds,
  [in]      const timeval *timeout,
  [out]     LPINT lpErrno
)
{...}

Parameter

[in] nfds

Wird nur aus Gründen der Kompatibilität ignoriert und eingeschlossen.

[in, out] readfds

Optionaler Zeiger auf eine Reihe von Sockets, die auf Lesbarkeit überprüft werden sollen.

[in, out] writefds

Optionaler Zeiger auf eine Reihe von Sockets, die auf Beschreibbarkeit überprüft werden sollen.

[in, out] exceptfds

Optionaler Zeiger auf eine Reihe von Sockets, die auf Fehler überprüft werden sollen.

[in] timeout

Maximale Wartezeit für LPWSPSelect oder NULL für einen blockierenden Vorgang in Form einer timeval-Struktur .

[out] lpErrno

Zeiger auf den Fehlercode.

Rückgabewert

Die LPWSPSelect-Funktion gibt die Gesamtzahl der Deskriptoren zurück, die bereit sind und in den fd_set-Strukturen enthalten sind, oder SOCKET_ERROR, wenn ein Fehler aufgetreten ist. Wenn der Rückgabewert SOCKET_ERROR ist, ist ein bestimmter Fehlercode in lpErrno verfügbar.

Fehlercode Bedeutung
WSAEFAULT
Der Windows Sockets-Dienstanbieter konnte die erforderlichen Ressourcen für seine internen Vorgänge nicht zuordnen, oder die Readfds, writefds, außerfds oder timeval-Parameter sind nicht Teil des Benutzeradressraums.
WSAENETDOWN
Fehler beim Netzwerksubsystem.
WSAEINVAL
Der Timeoutwert ist ungültig, oder alle drei Deskriptorparameter waren NULL.
WSAEINTR
Der (Blockierende) Anruf wurde über LPWSPCancelBlockingCall abgebrochen.
WSAEINPROGRESS
Der Windows Sockets-Aufruf wird blockiert, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAENOTSOCK
Einer der Deskriptorsätze enthält einen Eintrag, der kein Socket ist.

Hinweise

Diese 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 eine bestimmte status angefordert wird, wird durch eine fd_set-Struktur angegeben. Alle Einträge in einer fd_set entsprechen Sockets, die vom Dienstanbieter erstellt wurden (d. a. die WSAPROTOCOL_INFO Strukturen, die ihre Protokolle beschreiben, haben denselben providerId-Wert ). Bei der Rückgabe werden die Strukturen aktualisiert, um die Teilmenge dieser Sockets widerzuspiegeln, die die angegebene Bedingung erfüllen, und LPWSPSelect gibt die Gesamtzahl der Sockets zurück, die die Bedingungen erfüllen. Zum Bearbeiten eines fd_set wird eine Reihe von Makros bereitgestellt. Diese Makros sind mit denen kompatibel, die in der Berkeley-Software verwendet werden, aber die zugrunde liegende Darstellung ist völlig anders.

Der Parameter readfds identifiziert die Sockets, die auf Lesbarkeit überprüft werden sollen. Wenn der Socket derzeit ÜBER LPWSPListen lauscht, wird er als lesbar markiert, wenn eine eingehende Verbindungsanforderung empfangen wurde, sodass ein LPWSPAccept garantiert abgeschlossen wird, ohne zu blockieren. Bei anderen Sockets bedeutet Lesbarkeit, dass Daten in der Warteschlange zum Lesen verfügbar sind, sodass ein LPWSPRecv - oder LPWSPRecvFrom-Wert garantiert nicht blockiert wird.

Bei verbindungsorientierten Sockets kann die Lesbarkeit auch darauf hindeuten, dass eine Close-Anforderung vom Peer empfangen wurde. Wenn die virtuelle Verbindung ordnungsgemäß geschlossen wurde, wird ein LPWSPRecv sofort mit null gelesenen Bytes zurückgegeben. Wenn die virtuelle Verbindung zurückgesetzt wurde, wird ein LPWSPRecv sofort mit einem Fehlercode wie WSAECONNRESET abgeschlossen. Das Vorhandensein von OOB-Daten wird überprüft, ob die Socketoption SO_OOBINLINE aktiviert wurde (siehe LPWSPSetSockOpt).

Der Parameter writefds identifiziert die Sockets, die auf Schreibbarkeit überprüft werden sollen:

  • Wenn ein Socket eine Verbindung über LPWSPConnect herstellt, bedeutet Schreibbarkeit, dass die Verbindungsherstellung erfolgreich abgeschlossen wurde.
  • Wenn der Socket nicht über LPWSPConnect lauscht, bedeutet die Schreibbarkeit, dass ein LPWSPSend oder LPWSPSendTo garantiert erfolgreich ist.

Sie können jedoch auf einem blockierenden Socket blockieren, wenn das Len den verfügbaren Pufferspeicherplatz des ausgehenden Systems überschreitet. Es ist nicht angegeben, wie lange diese Garantien gültig sein können, insbesondere in einer Multithreadumgebung.

Der Parameter exceptfds identifiziert die Sockets, die auf das Vorhandensein von OOB-Daten oder auf außergewöhnliche Fehlerbedingungen überprüft werden sollen. Beachten Sie, dass OOB-Daten nur dann auf diese Weise gemeldet werden, wenn die Option SO_OOBINLINE FALSE ist. Wenn ein Socket eine LPWSPConnect-Verbindung (nonblocking) herstellt, wird ein Fehler des Verbindungsversuchs in exceptfds angezeigt. Diese Spezifikation definiert nicht, welche anderen Fehler eingeschlossen werden sollen.

Alle zwei readfds, writefds oder exceptfds können als NULL angegeben werden, wenn keine Deskriptoren auf den relevanten Zustand überprüft werden sollen. Mindestens einer muss ungleich NULL sein, und jeder Deskriptorsatz ungleich NULL muss mindestens einen Socketdeskriptor enthalten.

Zusammenfassung: Ein Socket wird in einer bestimmten Menge identifiziert, wenn LPWSPSelect wie folgt zurückgibt .

Parameter BESCHREIBUNG
readfds: Wenn LPWSPListen aufgerufen wird, steht eine Verbindung aus, LPWSPAccept ist 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 LPWSPConnect (nonblocking) ist, wurde die Verbindung erfolgreich hergestellt. Daten können gesendet werden.
exceptfds: Wenn LPWSPConnect (nicht blockiert) ist, ist der Verbindungsversuch fehlgeschlagen. OOB-Daten sind zum Lesen verfügbar (nur, wenn SO_OOBINLINE deaktiviert ist).

 

 

Drei Makros und eine upcall-Funktion sind in der Headerdatei Ws2spi.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, der vor #including Ws2spi.h durch #defining FD_SETSIZE in einen anderen Wert geändert werden kann.) Intern werden Sockethandles in einem fd_set nicht als Bitflags wie in Berkeley UNIX dargestellt. Ihre Datendarstellung ist undurchsichtig. Durch die Verwendung dieser Makros wird die Softwareportabilität zwischen verschiedenen Socketumgebungen beibehalten.

Die Makros zum Bearbeiten und Überprüfen fd_set Inhalte lauten wie folgt:

FD_CLR(s, *set)

Entfernt den Deskriptor s aus dem Satz.

FD_SET(n, *set)

Fügt festzulegende Deskriptoren hinzu.

FD_ZERO(*set)

Initialisiert den Satz mit dem NULL-Satz .

Die upcall-Funktion, die zum Überprüfen der Mitgliedschaft verwendet wird, lautet:

intWPUFDIsSet (SOCKETs, FD_SETFAR-Satz *);

gibt einen Wert ungleich null zurück, wenn s ein Element des Satzes oder andernfalls 0 ist.

Das Parametertimeout steuert, wie lange der LPWSPSelect-Vorgang dauern kann. Wenn timeout ein NULL-Zeiger ist, wird LPWSPSelect 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 LPWSPSelect vor der Rückgabe warten soll. Wenn LPWSPSelect zurückgibt, wird der Inhalt der timeval-Struktur nicht geändert. Wenn timeval mit {0, 0} initialisiert wird, wird LPWSPSelect sofort zurückgegeben. wird verwendet, um den Status der ausgewählten Sockets abzufragen. Wenn dies der Fall ist, gilt der LPWSPSelect-Aufruf als nicht blockierend, und die Standardannahmen für Nichtblockierungsaufrufe gelten. Beispielsweise wird der blockierende Hook nicht aufgerufen, und der Windows Sockets-Anbieter liefert nicht.

Hinweis

Die LPWSPSelect-Funktion hat keine Auswirkungen auf die Persistenz von Socketereignissen, die mit LPWSPAsyncSelect oder LPWSPEventSelect registriert sind.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Kopfzeile ws2spi.h

Weitere Informationen

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo