Compartir a través de


Función WSAEnumNetworkEvents (winsock2.h)

La función WSAEnumNetworkEvents detecta repeticiones de eventos de red para el socket indicado, borra los registros de eventos de red internos y restablece los objetos de evento (opcional).

Sintaxis

int WSAAPI WSAEnumNetworkEvents(
  [in]  SOCKET             s,
  [in]  WSAEVENT           hEventObject,
  [out] LPWSANETWORKEVENTS lpNetworkEvents
);

Parámetros

[in] s

Descriptor que identifica el socket.

[in] hEventObject

Identificador opcional que identifica un objeto de evento asociado que se va a restablecer.

[out] lpNetworkEvents

Puntero a una estructura WSANETWORKEVENTS que se rellena con un registro de eventos de red que se produjeron y cualquier código de error asociado.

Valor devuelto

El valor devuelto es cero si la operación se realizó correctamente. De lo contrario, se devuelve el valor SOCKET_ERROR y se puede recuperar un número de error específico mediante una llamada a WSAGetLastError.

Código de error Significado
WSANOTINITIALISED
Debe producirse una llamada WSAStartup correcta antes de usar esta función.
WSAENETDOWN
Error en el subsistema de red.
WSAEINVAL
Uno de los parámetros especificados no era válido.
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
El descriptor no es un socket.
WSAEFAULT
El parámetro lpNetworkEvents no es una parte válida del espacio de direcciones del usuario.

Comentarios

La función WSAEnumNetworkEvents se usa para detectar qué eventos de red se han producido para el socket indicado desde la última invocación de esta función. Está diseñado para su uso junto con WSAEventSelect, que asocia un objeto de evento a uno o varios eventos de red. La grabación de eventos de red comienza cuando se llama a WSAEventSelect con un parámetro lNetworkEvents distinto de cero y permanece vigente hasta que se realiza otra llamada a WSAEventSelect con el parámetro lNetworkEvents establecido en cero, o hasta que se realiza una llamada a WSAAsyncSelect.

WSAEnumNetworkEvents solo notifica la actividad de red y los errores designados a través de WSAEventSelect. Consulte las descripciones de select y WSAAsyncSelect para averiguar cómo esas funciones notifican la actividad y los errores de red.

El registro interno del socket de eventos de red se copia en la estructura a la que hace referencia lpNetworkEvents, después de la cual se borra el registro de eventos de red internos. Si el parámetro hEventObject no es NULL, el objeto de evento indicado también se restablece. El proveedor de Windows Sockets garantiza que las operaciones de copiar el registro de eventos de red, borrarlo y restablecer cualquier objeto de evento asociado son atómicos, de modo que la siguiente aparición de un evento de red designado hará que el objeto de evento se establezca. En el caso de que esta función devuelva SOCKET_ERROR, el objeto de evento asociado no se restablece y no se borra el registro de eventos de red.

El miembro lNetworkEvents de la estructura WSANETWORKEVENTS indica cuáles de los eventos de red de FD_XXX se han producido. La matriz iErrorCode se usa para contener los códigos de error asociados con el índice de matriz correspondiente a la posición de los bits de evento en lNetworkEvents. Los identificadores como FD_READ_BIT y FD_WRITE_BIT se pueden usar para indexar la matriz iErrorCode . Tenga en cuenta que solo se establecen los elementos de la matriz iErrorCode que corresponden a los bits establecidos en el parámetro lNetworkEvents . Otros parámetros no se modifican (esto es importante para la compatibilidad con versiones anteriores con las aplicaciones que no son conscientes de los nuevos eventos de FD_ROUTING_INTERFACE_CHANGE y FD_ADDRESS_LIST_CHANGE).

Se pueden devolver los siguientes códigos de error junto con el evento de red correspondiente.

Evento: FD_CONNECT

Código de error Significado
WSAEAFNOSUPPORT Las direcciones de la familia especificada no se pueden usar con este socket.
WSAECONNREFUSED El intento de conexión se rechazó con fuerza.
WSAENETUNREACH La red no se puede alcanzar desde este host en estos momentos.
WSAENOBUFS No hay espacio disponible en el búfer. El socket no se puede conectar.
WSAETIMEDOUT Se agota el tiempo de espera de la conexión sin establecer una conexión.
 

Evento: FD_CLOSE

Código de error Significado
WSAENETDOWN Error en el subsistema de red.
WSAECONNRESET El lado remoto ha restablecido la conexión.
WSAECONNABORTED La conexión se finalizó debido a un tiempo de espera u otro error.
 

Evento: FD_ACCEPT

Evento: FD_ADDRESS_LIST_CHANGE

Evento: FD_GROUP_QOS

Evento: FD_QOS

Evento: FD_OOB

Evento: FD_READ

Evento: FD_WRITE

Código de error Significado
WSAENETDOWN Error en el subsistema de red.
 

Evento: FD_ROUTING_INTERFACE_CHANGE

Código de error Significado
WSAENETUNREACH El destino especificado ya no es accesible.
WSAENETDOWN Error en el subsistema de red.
 

Código de ejemplo

En el ejemplo siguiente se muestra el uso de la función WSAEnumNetworkEvents.
#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <windows.h>

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int main()
{
//-------------------------
// Declare and initialize variables
    WSADATA wsaData;
    int iResult;

    SOCKET SocketArray[WSA_MAXIMUM_WAIT_EVENTS], ListenSocket;
    WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
    WSANETWORKEVENTS NetworkEvents;
    sockaddr_in InetAddr;
    DWORD EventTotal = 0;
    DWORD Index;
    DWORD i;
    
    HANDLE NewEvent = NULL; 

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

//-------------------------
// Create a listening socket
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %d\n", WSAGetLastError() );
        return 1;
    }
    
    InetAddr.sin_family = AF_INET;
    InetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    InetAddr.sin_port = htons(27015);

//-------------------------
// Bind the listening socket
    iResult = bind(ListenSocket, (SOCKADDR *) & InetAddr, sizeof (InetAddr));
    if (iResult != 0) {
        wprintf(L"bind failed with error: %d\n", WSAGetLastError() );
        return 1;
    }

//-------------------------
// Create a new event
    NewEvent = WSACreateEvent();
    if (NewEvent == NULL) {
        wprintf(L"WSACreateEvent failed with error: %d\n", GetLastError() );
        return 1;
    }    

//-------------------------
// Associate event types FD_ACCEPT and FD_CLOSE
// with the listening socket and NewEvent
    iResult = WSAEventSelect(ListenSocket, NewEvent, FD_ACCEPT | FD_CLOSE);
    if (iResult != 0) {
        wprintf(L"WSAEventSelect failed with error: %d\n", WSAGetLastError() );
        return 1;
    }

//-------------------------
// Start listening on the socket
    iResult = listen(ListenSocket, 10);
    if (iResult != 0) {
        wprintf(L"listen failed with error: %d\n", WSAGetLastError() );
        return 1;
    }

//-------------------------
// Add the socket and event to the arrays, increment number of events
    SocketArray[EventTotal] = ListenSocket;
    EventArray[EventTotal] = NewEvent;
    EventTotal++;

//-------------------------
// Wait for network events on all sockets
    Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE);
    Index = Index - WSA_WAIT_EVENT_0;

//-------------------------
// Iterate through all events and enumerate
// if the wait does not fail.
    for (i = Index; i < EventTotal; i++) {
        Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 1000, FALSE);
        if ((Index != WSA_WAIT_FAILED) && (Index != WSA_WAIT_TIMEOUT)) {
            WSAEnumNetworkEvents(SocketArray[i], EventArray[i], &NetworkEvents);
        }
    }

//...
    return 0;


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

Requisito Value
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

WSAEventSelect

Funciones winsock

Referencia de Winsock