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
[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 |
---|---|
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. | |
|
Error en el subsistema de red. |
El valor de tiempo de espera de |
|
(Bloqueo) la llamada se canceló a través de LPWSPCancelBlockingCall. | |
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. | |
|
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 de
Resumen: un socket se identificará en un conjunto determinado cuando LPWSPSelect devuelve según lo siguiente.
Parámetro | Descripción |
---|---|
readfds : | Si se llama |
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
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 |