Compartir a través de


Función de devolución de llamada LPWSPSELECT (ws2spi.h)

La función LPWSPSelect determina el estado de uno o varios sockets.

Sintaxis

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
)
{...}

Parámetros

[in] nfds

Se omite y solo se incluye por motivos de compatibilidad.

[in, out] readfds

Puntero opcional a un conjunto de sockets que se van a comprobar para mejorar la legibilidad.

[in, out] writefds

Puntero opcional a un conjunto de sockets que se van a comprobar para comprobar la writy.

[in, out] exceptfds

Puntero opcional a un conjunto de sockets que se van a comprobar si hay errores.

[in] timeout

Tiempo máximo para LPWSPSelect esperar o null para una operación de bloqueo, en forma de una estructura timeval de .

[out] lpErrno

Puntero al código de error.

Valor devuelto

La función LPWSPSelect devuelve el número total de descriptores que están listos y contenidos en las estructuras de fd_set o SOCKET_ERROR si se produjo un error. Si el valor devuelto es SOCKET_ERROR, hay disponible un código de error específico en lpErrno.

Código de error Significado
WSAEFAULT
El proveedor de servicios de Windows Sockets no pudo asignar los recursos necesarios para sus operaciones internas, o los readfds, writefds, exceptfds o timeval parámetros no forman parte del espacio de direcciones del usuario.
WSAENETDOWN de
Error en el subsistema de red.
WSAEINVAL
El valor de tiempo de espera de no es válido o los tres parámetros de descriptor se NULL.
WSAEINTR
(Bloqueo) la llamada se canceló a través de LPWSPCancelBlockingCall.
WSAEINPROGRESS
El bloqueo de la llamada a Windows Sockets está en curso o el proveedor de servicios sigue procesando una función de devolución de llamada.
WSAENOTSOCK de
Uno de los conjuntos de descriptores contiene una entrada que no es un socket.

Observaciones

Esta función se usa para determinar el estado de uno o varios sockets. Para cada socket, el autor de la llamada puede solicitar información sobre el estado de lectura, escritura o error. El conjunto de sockets para los que se solicita un estado determinado se indica mediante una estructura fd_set. Todas las entradas de un fd_set corresponden a los sockets creados por el proveedor de servicios (es decir, las estructuras de WSAPROTOCOL_INFO que describen sus protocolos tienen el mismo valor providerId). Tras la devolución, las estructuras se actualizan para reflejar el subconjunto de estos sockets que cumplen la condición especificada y LPWSPSelect devuelve el número total de sockets que cumplen las condiciones. Se proporciona un conjunto de macros para manipular un fd_set. Estas macros son compatibles con las usadas en el software de Berkeley, pero la representación subyacente es completamente diferente.

El parámetro readfds identifica los sockets que se van a comprobar para mejorar la legibilidad. Si el socket está escuchando actualmente a través de LPWSPListen, se marcará como legible si se ha recibido una solicitud de conexión entrante, de modo que se garantiza que una LPWSPAccept se complete sin bloqueo. En el caso de otros sockets, la legibilidad significa que los datos en cola están disponibles para su lectura, de modo que se garantiza que una LPWSPRec v o LPWSPRecvFrom no se bloquee.

En el caso de los sockets orientados a la conexión, la legibilidad también puede indicar que se ha recibido una solicitud de cierre del mismo nivel. Si el circuito virtual se cerró correctamente, un LPWSPRecv devolverá inmediatamente con cero bytes leídos. Si se restablece el circuito virtual, una LPWSPRecv se completará inmediatamente con un código de error, como WSAECONNRESET. La presencia de datos OOB se comprobará si la opción de socket SO_OOBINLINE se ha habilitado (consulte LPWSPSetSockOpt).

El parámetro writefds identifica los sockets que se van a comprobar para la writy:

  • Si un socket se conecta a través de LPWSPConnect, la writability significa que el establecimiento de la conexión se completó correctamente.
  • Si el socket no está en proceso de escuchar a través de LPWSPConnect, la writability significa que se garantiza que un LPWSPSend o LPWSPSendTo se garantiza que se realice correctamente.

Sin embargo, pueden bloquearse en un socket de bloqueo si el len supera la cantidad de espacio de búfer del sistema saliente disponible. No se especifica cuánto tiempo se pueden suponer que estas garantías son válidas, especialmente en un entorno multiproceso.

El parámetro exceptfds identifica los sockets que se van a comprobar para la presencia de datos OOB o cualquier condición de error excepcional. Tenga en cuenta que los datos de OOB solo se notificarán de esta manera si la opción SO_OOBINLINE es FALSE. Si un socket realiza una conexión de LPWSPConnect (sin bloqueo), se indica un error del intento de conexión en exceptfds. Esta especificación no define qué otros errores se incluirán.

Dos de , writefds, o exceptfds se pueden proporcionar como null si no se debe comprobar ningún descriptor para la condición de interés. Al menos uno debe ser distinto denull, y cualquier conjunto de descriptores nonull debe contener al menos un descriptor de socket.

Resumen: un socket se identificará en un conjunto determinado cuando LPWSPSelect devuelve según lo siguiente.

Parámetro Descripción
readfds : Si se llama LPWSPListen, hay una conexión pendiente, LPWSPAccept se realizará correctamente. Los datos están disponibles para leer (incluye datos OOB si SO_OOBINLINE está habilitado). La conexión se ha cerrado, restablecido o finalizado.
writefds : Si LPWSPConnect (sin bloqueo), la conexión se ha realizado correctamente. Se pueden enviar datos.
exceptfds: Si LPWSPConnect (sin bloqueo), se produjo un error en el intento de conexión. Los datos de OOB están disponibles para lectura (solo si SO_OOBINLINE está deshabilitado).

 

 

Tres macros y una función upcall se definen en el archivo de encabezado Ws2spi.h para manipular y comprobar los conjuntos de descriptores. La variable FD_SETSIZE determina el número máximo de descriptores de un conjunto. (El valor predeterminado de FD_SETSIZE es 64, que se puede modificar #defining FD_SETSIZE a otro valor antes de #including Ws2spi.h). Internamente, los identificadores de socket de una fd_set no se representan como marcas de bits como en Berkeley UNIX. Su representación de datos es opaca. El uso de estas macros mantendrá la portabilidad de software entre diferentes entornos de socket.

Las macros que se van a manipular y comprobar fd_set contenido son:

FD_CLR(s, *set)

Quita el del descriptor de establecido.

FD_SET(s, *set)

Agrega de de descriptores a establecer.

FD_ZERO(*establecer)

Inicializa el conjunto de en el conjunto de null.

La función upcall usada para comprobar la pertenencia es:

intWPUFDIsSet (SOCKETs, FD_SET FAR *set);

que devolverá un valor distinto de cero si s es miembro del establecido o cero.

El parámetro tiempo de espera controla cuánto tiempo puede tardar el LPWSPSelect puede tardar en completarse. Si de tiempo de espera es un puntero de null null, LPWSPSelect bloqueará indefinidamente hasta que al menos un descriptor cumpla los criterios especificados. De lo contrario, tiempo de espera apunta a una estructura de timeval de que especifica el tiempo máximo que LPWSPSelect debe esperar antes de volver. Cuando LPWSPSelect devuelve, no se modifica el contenido de la estructura de timeval. Si timeval se inicializa en {0, 0}, LPWSPSelect devolverá inmediatamente; se usa para sondear el estado de los sockets seleccionados. Si este es el caso, la LPWSPSelect llamada se considera no de bloqueo y se aplican las suposiciones estándar para las llamadas sin bloqueo. Por ejemplo, no se llamará al enlace de bloqueo y el proveedor de Windows Sockets no se producirá.

Nota

La función LPWSPSelect no tiene ningún efecto en la persistencia de eventos de socket registrados con LPWSPAsyncSelect o LPWSPEventSelect.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 2000 Professional [solo aplicaciones de escritorio]
servidor mínimo admitido Windows 2000 Server [solo aplicaciones de escritorio]
encabezado de ws2spi.h

Consulte también

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo