Compartir a través de


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
WSANOTINITIALISED
Debe producirse una llamada WSAStartup correcta antes de usar esta función.
WSAEFAULT
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.
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
Se canceló una llamada de Bloqueo de Windows Socket 1.1 a través de WSACancelBlockingCall.
WSAEINPROGRESS
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.
WSAENOTSOCK
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.

Nota Los datos fuera de banda solo se notificarán de esta manera si la opción SO_OOBINLINE es FALSE. Si un socket está procesando una llamada de conexión (sin bloqueo), el error del intento de conexión se indica en exceptfds (la aplicación debe llamar a getsockopt SO_ERROR para determinar el valor de error para describir por qué se produjo el error). Este documento no define qué otros errores se incluirán.
 
Cualquiera de los dos parámetros, readfds, writefds o exceptfds, se puede proporcionar como null. Al menos uno debe ser distinto de NULL y cualquier conjunto de descriptores que no sea NULL debe contener al menos un identificador para un socket.

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.
writefds:
  • Si procesa una llamada de conexión (sin bloqueo), la conexión se ha realizado correctamente.
  • Se pueden enviar datos.
exceptfds:
  • 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).
Cuatro macros se definen en el archivo de encabezado Winsock2.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 definiendo FD_SETSIZE a otro valor antes de incluir Winsock2.h). Internamente, los identificadores de socket en una estructura de 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_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á.

Nota La función select no tiene ningún efecto en la persistencia de los eventos de socket registrados con WSAAsyncSelect o WSAEventSelect.
 
Nota Al emitir una llamada de Winsock de bloqueo, como seleccionar con el parámetro de tiempo de espera establecido en NULL, Winsock puede que tenga que esperar un evento de red antes de que se pueda completar la llamada. Winsock realiza una espera alertable en esta situación, que se puede interrumpir mediante una llamada de procedimiento asincrónica (APC) programada en el mismo subproceso. La emisión de otra llamada winsock de bloqueo dentro de un APC que interrumpió una llamada de Winsock de bloqueo en curso en el mismo subproceso provocará un comportamiento indefinido y los clientes winsock nunca deben intentarlo.
 
Windows Phone 8: esta función es compatible con las aplicaciones de Windows Phone Store en Windows Phone 8 y versiones posteriores.

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

Consulte también

TIMEVAL

WSAAsyncSelect

WSAEventSelect

Funciones winsock

Referencia de Winsock

accept

connect

recv

recvfrom

enviar