Compartir a través de


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

La función LPWSPEventSelect especifica un objeto de evento que se va a asociar al conjunto proporcionado de eventos de red.

Sintaxis

LPWSPEVENTSELECT Lpwspeventselect;

int Lpwspeventselect(
  [in]  SOCKET s,
  [in]  WSAEVENT hEventObject,
  [in]  long lNetworkEvents,
  [out] LPINT lpErrno
)
{...}

Parámetros

[in] s

Descriptor que identifica el socket.

[in] hEventObject

Identificador que identifica el objeto de evento que se va a asociar al conjunto proporcionado de eventos de red.

[in] lNetworkEvents

Máscara de bits que especifica la combinación de eventos de red en los que el cliente SPI de Windows Sockets tiene interés. Construido mediante el operador OR bit a bit con cualquiera de estos valores.

Valor Significado
FD_READ
Emite la notificación de preparación para la lectura.
FD_WRITE
Emite la notificación de preparación para escribir.
FD_OOB
Notificación de problemas de la llegada de datos de OOB.
FD_ACCEPT
Emite la notificación de las conexiones entrantes.
FD_CONNECT
Notificación de problemas de conexión completada.
FD_CLOSE
Notificación de problemas de cierre de sockets.
FD_QOS
Problemas de notificación de cambios de socket (QoS).
FD_GROUP_QOS
Reservado.
FD_ROUTING_INTERFACE_CHANGE
Emite la notificación de los cambios de interfaz de enrutamiento para los destinos especificados.
FD_ADDRESS_LIST_CHANGE
Emite la notificación de los cambios en la lista de direcciones locales para la familia de direcciones del socket.

[out] lpErrno

Puntero al código de error. Consulte la sección valor devuelto para obtener más información.

Valor devuelto

El valor devuelto es cero si la especificación del cliente SPI de Windows Sockets de los eventos de red y el objeto de evento asociado se realizó correctamente. De lo contrario, se devuelve el valor SOCKET_ERROR y hay disponible un número de error específico en lpErrno.

Código de error Significado
WSAENETDOWN
Error en el subsistema de red.
WSAEINVAL
Indica que uno de los parámetros especificados no era válido o que el socket especificado está en un estado no válido.
WSAEINPROGRESS
Bloquear la llamada a Windows Sockets está en curso o el proveedor de servicios sigue procesando una función de devolución de llamada.
WSAENOTSOCK
El descriptor no es un socket.

Observaciones

Esta función se usa para especificar un objeto de evento, hEventObject, que se asociará a los eventos de red seleccionados, lNetworkEvents. El socket para el que se especifica un objeto de evento se identifica mediante s. El objeto de evento se establece cuando se produce cualquiera de los eventos de red designados.

LPWSPEventSelect funciona de forma muy similar a LPWSPAsyncSelect, la diferencia en las acciones realizadas cuando se produce un evento de red designado. Mientras que WSPAsyncSelect hace que se publique un mensaje de Windows Sockets SPI especificado por el cliente de Windows, LPWSPEventSelect establece el objeto de evento asociado y registra la aparición de este evento en un registro de eventos de red interno. Un cliente SPI de Windows Sockets puede usar LPWSPEnumNetworkEvents para recuperar el contenido del registro de eventos de red interno y, por tanto, determinar cuál de los eventos de red designados se han producido.

LPWSPEventSelect es la única función que hace que la actividad de red y los errores se registren y recuperen a través de LPWSPEnumNetworkEvents. Consulte las descripciones de LPWSPSelect y LPWSPAsyncSelect para averiguar cómo estas funciones notifican la actividad y los errores de red.

Esta función establece automáticamente el de socket en modo de no bloqueo, independientemente del valor de lNetworkEvents.

Al emitir un LPWSPEventSelect para un socket se cancela cualquier LPWSPAsyncSelect o LPWSPEventSelect para el mismo socket y borra el registro de eventos de red interno. Por ejemplo, para asociar un objeto de evento con eventos de red de lectura y escritura, el cliente SPI de Windows Sockets debe llamar a LPWSPEventSelect con FD_READ y FD_WRITE, como este.

rc = WSPEventSelect(s, hEventObject, FD_READ | FD_WRITE);

No es posible especificar objetos de evento diferentes para distintos eventos de red. El código siguiente no funcionará; la segunda llamada cancela los efectos del primero y la única asociación será el evento de red FD_WRITE asociado a hEventObject2.

// Incorrect example.
rc = WSPEventSelect(s, hEventObject1, FD_READ);
rc = WSPEventSelect(s, hEventObject2, FD_WRITE);

Para cancelar la asociación y selección de eventos de red en un socket, debe establecer lNetworkEvents en cero, en cuyo caso se omite el parámetro hEventObject.

rc = WSPEventSelect(s, hEventObject, 0);

Al cerrar un socket con LPWSPCloseSocket también se cancela la asociación y selección de eventos de red especificados en LPWSPEventSelect para el socket. Sin embargo, el cliente SPI de Windows Sockets debe llamar a WSACloseEvent para cerrar explícitamente el objeto de evento y liberar los recursos.

Dado que un LPWSPAccept"socket ed" tiene las mismas propiedades que el socket de escucha usado para aceptarlo, cualquier LPWSPEventSelect asociación y selección de eventos de red establecidos para el socket de escucha se aplica al socket aceptado. Por ejemplo, si un socket de escucha tiene LPWSPEventSelect asociación de hEventObject con FD_ACCEPT, FD_READ y FD_WRITE, cualquier socket aceptado en ese socket de escucha también tendrá FD_ACCEPT, FD_READ y eventos de red FD_WRITE asociados con el mismo hEventObject. Si se desea otro hEventObject o eventos de red, el cliente SPI de Windows Sockets debe llamar a LPWSPEventSelect, pasando el socket aceptado y la nueva información deseada.

Después de registrar correctamente la aparición del evento de red y señalar el objeto de evento asociado, no se realizan más acciones para ese evento de red hasta que el cliente SPI de Windows Sockets realiza la llamada de función que vuelve a habilitar implícitamente la configuración de ese evento de red y la señalización del objeto de evento asociado.

Evento de red Volver a habilitar la función
FD_READ LPWSPRecv o LPWSPRecvFrom
FD_WRITE LPWSPSend o LPWSPSendTo
FD_OOB LPWSPRecv o LPWSPRecvFrom
FD_ACCEPT LPWSPAccept, a menos que el código de error devuelto sea WSATRY_AGAIN que indique que la función condition devolvió CF_DEFER
FD_CONNECT NINGUNO
FD_CLOSE NINGUNO
FD_QOS LPWSPIoctl con SIO_GET_QOS
FD_GROUP_QOS Reservado para uso futuro con grupos de sockets: LPWSPIoctl con SIO_GET_GROUP_QOS
FD_ROUTING_INTERFACE_CHANGE LPWSPIoctl con SIO_ROUTING_INTERFACE_CHANGE de comandos
FD_ADDRESS_LIST_CHANGE LPWSPIoctl con SIO_ADDRESS_LIST_CHANGE de comandos

Cualquier llamada a la rutina de volver a habilitar, incluso una que produce un error, da como resultado volver a habilitar la grabación y la señalización para el evento de red y el objeto de evento pertinentes, respectivamente.

Para FD_READ, FD_OOB y eventos de red de FD_ACCEPT, la grabación de eventos de red y la señalización de objetos de evento se desencadenados en el nivel . Esto significa que si se llama a la rutina de volver a habilitar y la condición de red pertinente sigue siendo válida después de la llamada, se registra el evento de red y se señala el objeto de evento asociado. Esto permite que un cliente SPI de Windows Sockets esté controlado por eventos, mientras que también se desconceda con la cantidad de datos que llegan a cualquier momento. Tenga en cuenta la siguiente secuencia.

  1. El proveedor de servicios recibe 100 bytes de datos en el socket , registra el evento de red FD_READ y señala el objeto de evento asociado.
  2. Los problemas del cliente SPI de Windows Sockets WSPRecv(s, buffptr, 50, 0) leer 50 bytes.
  3. El proveedor de servicios registra el evento de red FD_READ y señala de nuevo el objeto de evento asociado, ya que todavía hay datos que se van a leer.

Con esta semántica, un cliente SPI de Windows Sockets no necesita leer todos los datos disponibles en respuesta a un evento de red de FD_READ. En su lugar, una sola LPWSPRecv en respuesta a cada evento de red FD_READ es adecuado.

Los eventos FD_QOS y FD_GROUP_QOS se consideran desencadenados por el perímetro. Un mensaje se publicará exactamente una vez cuando se produzca un cambio de calidad de servicio (QOS). No se emitirán más indicaciones hasta que el proveedor de servicios detecte un cambio adicional en QOS o el cliente SPI de Windows Sockets renegocia el QOS para el socket.

Los eventos FD_ROUTING_INTERFACE_CHANGE y FD_ADDRESS_LIST_CHANGE también se consideran desencadenados por el perímetro. Un mensaje se publicará exactamente una vez cuando se produzca un cambio después de el cliente SPI de Windows Sockets haya solicitado la notificación emitiendo WSAIoctl con SIO_ROUTING_INTERFACE_CHANGE o SIO_ADDRESS_LIST_CHANGE correspondientes. Los mensajes adicionales no estarán disponibles hasta que el cliente SPI de Windows Sockets vuelva a emitir el IOCTL y se detecte otro cambio, ya que se emitió el IOCTL.

Si ya se ha producido un evento de red cuando el cliente SPI de Windows Sockets llama a LPWSPEventSelect, o cuando se llama a la función de re-habilitación, se registra un evento de red y se señala el objeto de evento asociado, según corresponda. Por ejemplo, considere la siguiente secuencia.

  1. Un cliente SPI de Windows Sockets llama a LPWSPListen.
  2. Se recibe una solicitud de conexión, pero aún no se acepta.
  3. El cliente SPI de Windows Sockets llama LPWSPEventSelect especificando que está interesado en el evento de red FD_ACCEPT para el socket. El proveedor de servicios registra el evento de red FD_ACCEPT y indica inmediatamente el objeto de evento asociado.

El evento de red FD_WRITE se controla ligeramente de forma diferente. Se registra un evento de red FD_WRITE cuando un socket se conecta por primera vez con LPWSPConnect o se acepta con LPWSPAccepty, a continuación, después de que un LPWSPSend o LPWSPSendTo produzca un error con WSAEWOULDBLOCK y el espacio de búfer esté disponible. Por lo tanto, un cliente SPI de Windows Sockets puede suponer que los envíos son posibles a partir de la primera configuración de eventos de red FD_WRITE y duradera hasta que un envío devuelve WSAEWOULDBLOCK. Después de este error, el cliente SPI de Windows Sockets encontrará que los envíos vuelven a ser posibles cuando se registra un evento de red FD_WRITE y se señala el objeto de evento asociado.

El evento de red FD_OOB solo se usa cuando un socket está configurado para recibir datos fuera de banda por separado. Si el socket está configurado para recibir datos fuera de banda en línea, los datos fuera de banda (acelerados) se tratan como datos normales y el cliente SPI de Windows Sockets debe registrar un interés y obtendrá, FD_READ evento de red, no FD_OOB evento de red. Un cliente SPI de Windows Sockets puede establecer o inspeccionar la forma en que se van a controlar los datos fuera de banda mediante LPWSPSetSockOpt o LPWSPGetSockOpt para la opción de SO_OOBINLINE.

El código de error de un evento de red FD_CLOSE indica si el cierre del socket era correcto o anulativo. Si el código de error es 0, el cierre era correcto; Si el código de error es WSAECONNRESET, se restablece el circuito virtual del socket. Esto solo se aplica a sockets orientados a la conexión, como SOCK_STREAM.

El evento de red FD_CLOSE se registra cuando se recibe una indicación de cierre para el circuito virtual correspondiente al socket. En términos TCP, esto significa que el FD_CLOSE se registra cuando la conexión entra en los estados FIN WAIT o CLOSE WAIT. Esto resulta del extremo remoto que realiza una de LPWSPShutdown en el lado de envío o un LPWSPCloseSocket.

Los proveedores de servicios deben registrar solo un evento de red FD_CLOSE para indicar el cierre de un circuito virtual; debe no registrar un evento de red FD_READ para indicar esa condición.

El evento de red FD_QOS o FD_GROUP_QOS se registra cuando se ha producido un cambio en cualquier campo de la especificación de flujo asociada a ladel socket o al grupo de sockets al que pertenece , respectivamente. Este cambio debe estar disponible para los clientes SPI de Windows Sockets a través del función LPWSPIoctl con SIO_GET_QOS o SIO_GET_GROUP_QOS para recuperar el QOS actual para el socket s, o para el grupo de sockets s pertenece, respectivamente.

El evento de red FD_ROUTING_INTERFACE_CHANGE se registra cuando la interfaz local que se debe usar para llegar al destino especificado en WSAIoctl con SIO_ROUTING_INTERFACE_CHANGE cambios después de se ha emitido dicho IOCTL.

El evento de red FD_ADDRESS_LIST_CHANGE se registra cuando la lista de direcciones de la familia de protocolos de sockets a la que el cliente SPI de Windows Sockets puede enlazar los cambios después de WSAIoctl con SIO_ADDRESS_LIST_CHANGE se ha emitido.

Requisitos

Requisito Valor
cliente mínimo admitido Compilación 20348 de Windows 10
servidor mínimo admitido Compilación 20348 de Windows 10
encabezado de ws2spi.h

Consulte también

LPWSPEnumNetworkEvents