El valor de retorno de WSAEventSelect():
Devuelve 0 si el evento de red especificado por la aplicación y su objeto de evento correspondiente se configuraron correctamente. De lo contrario, se devolverá un error SOCKET_ERROR y la aplicación podrá obtener el código de error correspondiente a través de WSAGetLastError().
Cuando se utilizan las funciones select() y WSAAsyncSelect(), WSAEventSelect() se utiliza a menudo para decidir cuándo realizar una operación de transferencia de datos (como send() o recv()) y se espera un éxito inmediato. . Pero se debe preparar una aplicación estable para que se establezca el objeto de evento y una llamada a WinSock regrese inmediatamente con WSAEWOULDBLOCK. Por ejemplo, puede ocurrir la siguiente secuencia de operaciones:
(i) Los datos llegan a los sockets; WinSock establece el objeto de evento WSAEventSelect.
(ii) La aplicación realiza otras operaciones.
(iii) Mientras realizaba la operación, la aplicación llamó a ioctlsocket(s, FIONREAD...) y descubrió que los datos eran legibles.
(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 el error WSAEWOULDBLOCK.
También son posibles otras secuencias de operaciones.
Después de registrar con éxito la ocurrencia de un evento de red (configurando el bit correspondiente del registro de evento de red interno) y configurar la señal en el objeto de evento correspondiente, no se realizarán más operaciones en el evento de red hasta La aplicación llama a la función correspondiente para volver a habilitar explícitamente el evento de red y la señal del 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 el código de error devuelto sea WSATRY_AGAIN, lo que indica que la función condicional devuelve CF_DEFER.
FD_CONNECT NONE
FD_CLOSE NONE
FD_QOS Llame a WSAIoctl() con el comando SIO_GET_QOS.
FD_GROUP_QOS Utilice el comando SIO_GET_GROUP_QOS para llamar a WSAIoctl().
Código de error:
WSANOTINITIALISED WSAStartup() debe llamarse correctamente antes de llamar a esta API.
WSAENETDOWN El subsistema de red ha fallado.
Hay un valor ilegal en el parámetro WSAEINVAL o el socket especificado se encuentra en un estado ilegal.
WSAEINPROGRESS Hay una llamada de bloqueo de WinSock en curso o el proveedor de servicios aún está procesando una función de devolución de llamada
El descriptor WSAENOTSOCK no es un socket.
Ver también: WSACloseEvent(), WSACreateEvent(), WSAEnumNetworkEvents(), WSAGetOverlappedResult(), WSAWaitForMultipleEvents().