Valor de retorno de WSAEventSelect():
Si el evento de red especificado por la aplicación y su objeto de evento correspondiente se han configurado correctamente, se devuelve 0; de lo contrario, se devolverá un error SOCKET_ERROR y la aplicación puede obtener el código de error correspondiente a través de WSAGetLastError( ).
Cuando se utilizan las funciones select() y WSAAsyncSelect(), WSAEventSelect() normalmente se usa para determinar cuándo realizar una operación de transferencia de datos (como send() o recv()) y esperar un éxito inmediato. Sin embargo, las aplicaciones estables deben prepararse para que se establezca el objeto de evento y la llamada de WinSock devuelva WSAEWOULDBLOCK inmediatamente. Por ejemplo, podría ocurrir la siguiente secuencia de operaciones:
(i) Los datos llegan al socket; WinSock establece el objeto de evento WSAEventSelect.
(ii) La aplicación realiza otras operaciones.
(iii) Mientras realiza la operación, la aplicación llama a ioctlsocket(s, FIONREAD...) y descubre que hay datos para leer.
(iv) La aplicación llama a recv(s,...) para leer los datos.
(v) Finalmente, la aplicación espera el objeto de datos especificado por WSAEventSelect(), lo que indica que los datos son legibles.
(vi) La aplicación llama a recv(s,...) pero falla con un error WSAEWOULDBLOCK.
También pueden ocurrir otras secuencias de operaciones.
Después de que se registra con éxito la ocurrencia de un evento de red (configurando el bit correspondiente en el registro de eventos de red interno) y se señala el objeto de evento correspondiente, no se realizan más acciones sobre el evento de red hasta que la aplicación llamadas La función apropiada vuelve a habilitar explícitamente eventos de red y señala el objeto de evento correspondiente.
Función de readmisión de eventos de red
FD_READ recv() o recvfrom()
FD_WRITE send() o sendto()
FD_OOB recv ()
FD_ACCEPT aceptar() o WSAAccept() hasta que se devuelva el código de error WSATRY_AGAIN, lo que indica que la función condicional devuelve CF_DEFER.
FD_CONNECT Ninguno
FD_CLOSE Ninguno
FD_QOS Llama a WSAIoctl() usando el comando SIO_GET_QOS. ).
FD_GROUP_QOS llama a WSAIoctl() usando el comando SIO_GET_GROUP_QOS.
Código de error:
WSANOTINITIALISED Se debe realizar una llamada exitosa a WSAStartup() antes de llamar a esta API.
Error del subsistema de red WSAENETDOWN.
WSAEINVAL El parámetro WSAEINVAL tiene un valor ilegal o el socket especificado se encuentra en un estado ilegal.
WSAEINPROGRESS está bloqueando la llamada de WinSock o el proveedor de servicios aún está procesando la función de devolución de llamada
El descriptor WSAENOTSOCK no es un socket.
Ver también: WSACloseEvent(), WSACreateEvent(), WSAEnumNetworkEvents(), WSAGetOverlappedResult(), WSAWaitForMultipleEvents().