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 e incluye solo 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 idoneidad.

[in, out] exceptfds

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

[in] timeout

Tiempo máximo para que LPWSPSelect espere o null para una operación de bloqueo, en forma de una estructura de valor temporal .

[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 parámetros timeval no forman parte del espacio de direcciones del usuario.
WSAENETDOWN
Error en el subsistema de red.
WSAEINVAL
El valor de tiempo de espera no es válido o los tres parámetros descriptores eran 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
Uno de los conjuntos de descriptores contiene una entrada que no es un socket.

Comentarios

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 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, por lo que se garantiza que un 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 para que se garantice que un LPWSPRecv 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 restableció el circuito virtual, un LPWSPRecv se completará inmediatamente con un código de error, como WSAECONNRESET. La presencia de datos OOB se comprobará si se ha habilitado la opción de socket SO_OOBINLINE (consulte LPWSPSetSockOpt).

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

  • Si un socket se conecta a través de LPWSPConnect, la idoneidad significa que el establecimiento de la conexión se completó correctamente.
  • Si el socket no está en proceso de escucha a través de LPWSPConnect, la idoneidad significa que se garantiza que un LPWSPSend o LPWSPSendTo 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 comprobar 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 LPWSPConnect (sin bloqueo), el error del intento de conexión se indica en exceptfds. Esta especificación no define qué otros errores se incluirán.

Se pueden proporcionar dos de readfds, writefds o exceptfds como NULL si no se va a comprobar la condición de interés de ningún descriptor. Al menos uno debe ser distinto de NULL y cualquier conjunto de descriptores que no sea NULL debe contener al menos un descriptor de socket.

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

Parámetro Descripción
readfds: Si se llama a LPWSPListen , hay una conexión pendiente, LPWSPAccept se realizará correctamente. Los datos están disponibles para su lectura (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 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 en 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 los descriptores del conjunto.

FD_SET(s), *set)

Agrega los descriptores que se van a establecer.

FD_ZERO(*set)

Inicializa el conjunto en el conjunto nulo .

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 conjunto o, de lo contrario, cero.

El tiempo de espera del parámetro controla cuánto tiempo puede tardar LPWSPSelect en completarse. Si el tiempo de espera es un puntero nulo , LPWSPSelect se bloqueará indefinidamente hasta que al menos un descriptor cumpla los criterios especificados. De lo contrario, el tiempo de espera apunta a una estructura de valor temporal que especifica el tiempo máximo que LPWSPSelect debe esperar antes de devolver. Cuando LPWSPSelect devuelve, el contenido de la estructura timeval no se modifica. 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 llamada LPWSPSelect se considera no desbloqueada 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 los eventos de socket registrados con LPWSPAsyncSelect o LPWSPEventSelect.

Requisitos

   
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Encabezado ws2spi.h

Consulte también

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo