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 |
---|---|
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction. | |
Le sous-système réseau a échoué. | |
L’un des paramètres spécifiés n’était pas valide. | |
Un appel Windows Sockets 1.1 bloquant est en cours ou le fournisseur de services traite toujours une fonction de rappel. | |
Le descripteur n’est pas un socket. | |
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 |