WSAEnumNetworkEvents, fonction (winsock2.h)

La fonction WSAEnumNetworkEvents détecte les occurrences d’événements réseau pour le socket indiqué, efface les enregistrements d’événements réseau internes et réinitialise les objets d’événement (facultatif).

Syntaxe

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

Paramètres

[in] s

Descripteur identifiant le socket.

[in] hEventObject

Handle facultatif identifiant un objet d’événement associé à réinitialiser.

[out] lpNetworkEvents

Pointeur vers une structure WSANETWORKEVENTS remplie d’un enregistrement des événements réseau qui se sont produits et de tous les codes d’erreur associés.

Valeur retournée

La valeur de retour est zéro si l’opération a réussi. Sinon, la valeur SOCKET_ERROR est retournée et un numéro d’erreur spécifique peut être récupéré en appelant WSAGetLastError.

Code d'erreur Signification
WSANOTINITIALISED
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction.
WSAENETDOWN
Le sous-système réseau a échoué.
WSAEINVAL
L’un des paramètres spécifiés n’était pas valide.
WSAEINPROGRESS
Un appel Windows Sockets 1.1 bloquant est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAENOTSOCK
Le descripteur n’est pas un socket.
WSAEFAULT
Le paramètre lpNetworkEvents n’est pas une partie valide de l’espace d’adressage utilisateur.

Remarques

La fonction WSAEnumNetworkEvents permet de découvrir les événements réseau qui se sont produits pour le socket indiqué depuis le dernier appel de cette fonction. Il est destiné à être utilisé conjointement avec WSAEventSelect, qui associe un objet d’événement à un ou plusieurs événements réseau. L’enregistrement des événements réseau commence lorsque WSAEventSelect est appelé avec un paramètre lNetworkEvents différent de zéro et reste en vigueur jusqu’à ce qu’un autre appel soit effectué à WSAEventSelect avec le paramètre lNetworkEvents défini sur zéro, ou jusqu’à ce qu’un appel soit effectué à WSAAsyncSelect.

WSAEnumNetworkEvents signale uniquement l’activité réseau et les erreurs nommées via WSAEventSelect. Consultez les descriptions de select et WSAAsyncSelect pour savoir comment ces fonctions signalent l’activité du réseau et les erreurs.

L’enregistrement interne des événements réseau du socket est copié dans la structure référencée par lpNetworkEvents, après quoi l’enregistrement des événements réseau internes est effacé. Si le paramètre hEventObject n’est pas NULL, l’objet d’événement indiqué est également réinitialisé. Le fournisseur Windows Sockets garantit que les opérations de copie de l’enregistrement d’événement réseau, d’effacement et de réinitialisation de tout objet d’événement associé sont atomiques, de sorte que la prochaine occurrence d’un événement réseau nommé entraîne la définition de l’objet d’événement. Dans le cas de cette fonction retournant SOCKET_ERROR, l’objet d’événement associé n’est pas réinitialisé et l’enregistrement des événements réseau n’est pas effacé.

Le membre lNetworkEvents de la structure WSANETWORKEVENTS indique les événements réseau FD_XXX qui se sont produits. Le tableau iErrorCode est utilisé pour contenir tous les codes d’erreur associés avec l’index de tableau correspondant à la position des bits d’événement dans lNetworkEvents. Des identificateurs tels que FD_READ_BIT et FD_WRITE_BIT peuvent être utilisés pour indexer le tableau iErrorCode . Notez que seuls les éléments du tableau iErrorCode sont définis qui correspondent aux bits définis dans le paramètre lNetworkEvents . Les autres paramètres ne sont pas modifiés (ceci est important pour la compatibilité descendante avec les applications qui ne connaissent pas les nouveaux événements FD_ROUTING_INTERFACE_CHANGE et FD_ADDRESS_LIST_CHANGE).

Les codes d’erreur suivants peuvent être retournés avec l’événement réseau correspondant.

Événement : FD_CONNECT

Code d'erreur Signification
WSAEAFNOSUPPORT Impossible d'utiliser les adresses figurant dans la famille spécifiée avec ce socket.
WSAECONNREFUSED La tentative de connexion a été rejetée.
WSAENETUNREACH Le réseau ne peut pas être atteint à partir de cet hôte en ce moment.
WSAENOBUFS Aucune zone tampon disponible. Impossible de connecter le socket.
WSAETIMEDOUT Une tentative de connexion a expiré sans établir de connexion
 

Événement : FD_CLOSE

Code d'erreur Signification
WSAENETDOWN Le sous-système réseau a échoué.
WSAECONNRESET La connexion a été réinitialisée par le côté distant.
WSAECONNABORTED La connexion a été arrêtée en raison d’un délai d’attente ou d’un autre échec.
 

Événement : FD_ACCEPT

Événement : FD_ADDRESS_LIST_CHANGE

Événement : FD_GROUP_QOS

Événement : FD_QOS

Événement : FD_OOB

Événement : FD_READ

Événement : FD_WRITE

Code d'erreur Signification
WSAENETDOWN Le sous-système réseau a échoué.
 

Événement : FD_ROUTING_INTERFACE_CHANGE

Code d'erreur Signification
WSAENETUNREACH La destination spécifiée n’est plus accessible.
WSAENETDOWN Le sous-système réseau a échoué.
 

Exemple de code

L’exemple suivant illustre l’utilisation de la fonction 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 : cette fonction est prise en charge pour les applications Windows Phone Store sur Windows Phone 8 et versions ultérieures.

Windows 8.1 et Windows Server 2012 R2 : cette fonction est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 8.1, Windows Vista [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête winsock2.h
Bibliothèque Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

WSAEventSelect

Winsock Functions

Référence Winsock