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 |
---|---|
|
Emite la notificación de preparación para la lectura. |
|
Emite la notificación de preparación para escribir. |
|
Notificación de problemas de la llegada de datos de OOB. |
|
Emite la notificación de las conexiones entrantes. |
|
Notificación de problemas de conexión completada. |
|
Notificación de problemas de cierre de sockets. |
|
Problemas de notificación de cambios de socket (QoS). |
|
Reservado. |
|
Emite la notificación de los cambios de interfaz de enrutamiento para los destinos especificados. |
|
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
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 |
---|---|
Error en el subsistema de red. | |
Indica que uno de los parámetros especificados no era válido o que el socket especificado está en un estado no válido. | |
Bloquear la llamada a Windows Sockets está en curso o el proveedor de servicios sigue procesando una función de devolución de llamada. | |
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
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.
- 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.
- Los problemas del cliente SPI de Windows Sockets
WSPRecv(s, buffptr, 50, 0)
leer 50 bytes. - 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.
- Un cliente SPI de Windows Sockets llama a LPWSPListen.
- Se recibe una solicitud de conexión, pero aún no se acepta.
- 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
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
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 |