Función select (winsock2.h)
La función select determina el estado de uno o varios sockets, en espera si es necesario, para realizar E/S sincrónicas.
Sintaxis
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
);
Parámetros
[in] nfds
ignorado. El parámetro nfds solo se incluye por compatibilidad con sockets berkeley.
[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 seleccione esperar, proporcionado en forma de una estructura TIMEVAL . Establezca el parámetro timeout en NULL para las operaciones de bloqueo.
Valor devuelto
La función select devuelve el número total de identificadores de socket que están listos y contenidos en las estructuras de fd_set , cero si el límite de tiempo expiró o SOCKET_ERROR si se produjo un error. Si el valor devuelto es SOCKET_ERROR, WSAGetLastError se puede usar para recuperar un código de error específico.
Código de error | Significado |
---|---|
Debe producirse una llamada WSAStartup correcta antes de usar esta función. | |
La implementación de Windows Sockets no pudo asignar los recursos necesarios para sus operaciones internas o los parámetros readfds, writefds, exceptfds o timeval no forman parte del espacio de direcciones del usuario. | |
Error en el subsistema de red. | |
El valor de tiempo de espera no es válido o los tres parámetros descriptores eran null. | |
Se canceló una llamada de Bloqueo de Windows Socket 1.1 a través de WSACancelBlockingCall. | |
Una llamada de Bloqueo de Windows Sockets 1.1 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. |
Comentarios
La función select 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 . Los sockets contenidos en las estructuras de fd_set deben estar asociados a un único proveedor de servicios. Para esta restricción, se considera que los sockets proceden del mismo proveedor de servicios si las estructuras de WSAPROTOCOL_INFO que describen sus protocolos tienen el mismo valor providerId . A cambio, las estructuras se actualizan para reflejar el subconjunto de estos sockets que cumplen la condición especificada. La función select devuelve el número de sockets que cumplen las condiciones. Se proporciona un conjunto de macros para manipular una estructura de 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á actualmente en estado de escucha , se marcará como legible si se ha recibido una solicitud de conexión entrante de modo que se garantice que una aceptación se complete sin bloqueo. En el caso de otros sockets, la legibilidad significa que los datos en cola están disponibles para leer de forma que se garantice que una llamada a recv, WSARecvFrom, WSARecvFrom o recvfrom 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 para cerrar el socket del mismo nivel. Si el circuito virtual se cerró correctamente y se recibieron todos los datos, un recv devolverá inmediatamente con cero bytes leídos. Si se restablece el circuito virtual, un recv 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 setsockopt).
El parámetro writefds identifica los sockets que se van a comprobar para comprobar la idoneidad. Si un socket está procesando una llamada de conexión (sin bloqueo), se puede escribir un socket si el establecimiento de la conexión se completa correctamente. Si el socket no está procesando una llamada de conexión , se garantiza que un envío, envío o WSASendto se realice correctamente. Sin embargo, pueden bloquearse en un socket de bloqueo si el parámetro 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 detectar la presencia de datos OOB o cualquier condición de error excepcional.
En resumen, se identificará un socket en un conjunto determinado cuando la selección devuelva si:
readfds:
- Si se ha llamado a la escucha y hay una conexión pendiente, aceptará 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.
- Si procesa una llamada de conexión (sin bloqueo), la conexión se ha realizado correctamente.
- Se pueden enviar datos.
- Si procesa una llamada de conexión (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).
- FD_ZERO(*set): inicializa establecido en el conjunto vacío. Siempre se debe borrar un conjunto antes de usarlo.
- FD_CLR(s, *set): quita los sockets del conjunto.
- FD_ISSET(s, *set): comprueba si es miembro del conjunto y devuelve TRUE si es así.
- FD_SET(s), *set): agrega sockets que se van a establecer.
El tiempo de espera del parámetro controla cuánto tiempo puede tardar la selección en completarse. Si el tiempo de espera es un puntero nulo , la selección se bloqueará indefinidamente hasta que al menos un descriptor cumpla los criterios especificados. De lo contrario, el tiempo de espera apunta a una estructura TIMEVAL que especifica el tiempo máximo que debe esperar antes de volver. Cuando se devuelve select , el contenido de la estructura TIMEVAL no se modifica. Si TIMEVAL se inicializa en {0, 0}, la selección devolverá inmediatamente; se usa para sondear el estado de los sockets seleccionados. Si select devuelve inmediatamente, la llamada de selección 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 Windows Sockets no se producirá.
Windows 8.1 y Windows Server 2012 R2: esta función es compatible con las aplicaciones de la Tienda Windows en Windows 8.1, Windows Server 2012 R2 y versiones posteriores.
Requisitos
Cliente mínimo compatible | Windows 8.1, Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | winsock2.h |
Library | Ws2_32.lib |
Archivo DLL | Ws2_32.dll |