WSAEnumNetworkEvents-Funktion (winsock2.h)
Die WSAEnumNetworkEvents-Funktion ermittelt Vorkommen von Netzwerkereignissen für den angegebenen Socket, löscht interne Netzwerkereignisdatensätze und setzt Ereignisobjekte zurück (optional).
Syntax
int WSAAPI WSAEnumNetworkEvents(
[in] SOCKET s,
[in] WSAEVENT hEventObject,
[out] LPWSANETWORKEVENTS lpNetworkEvents
);
Parameter
[in] s
Ein Deskriptor, der den Socket identifiziert.
[in] hEventObject
Ein optionales Handle, das ein zugeordnetes Ereignisobjekt identifiziert, das zurückgesetzt werden soll.
[out] lpNetworkEvents
Ein Zeiger auf eine WSANETWORKEVENTS-Struktur , die mit einem Datensatz der aufgetretenen Netzwerkereignisse und allen zugeordneten Fehlercodes gefüllt ist.
Rückgabewert
Der Rückgabewert ist null, wenn der Vorgang erfolgreich war. Andernfalls wird der Wert SOCKET_ERROR zurückgegeben, und eine bestimmte Fehlernummer kann durch Aufrufen von WSAGetLastError abgerufen werden.
Fehlercode | Bedeutung |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
Fehler beim Netzwerksubsystem. | |
Einer der angegebenen Parameter war ungültig. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion. | |
Der Deskriptor ist kein Socket. | |
Der parameter lpNetworkEvents ist kein gültiger Teil des Benutzeradressraums. |
Hinweise
Die WSAEnumNetworkEvents-Funktion wird verwendet, um zu ermitteln, welche Netzwerkereignisse seit dem letzten Aufruf dieser Funktion für den angegebenen Socket aufgetreten sind. Es ist für die Verwendung in Verbindung mit WSAEventSelect vorgesehen, das ein Ereignisobjekt einem oder mehreren Netzwerkereignissen zuordnet. Die Aufzeichnung von Netzwerkereignissen beginnt, wenn WSAEventSelect mit einem lNetworkEvents-Parameter ungleich null aufgerufen wird, und bleibt wirksam, bis ein weiterer Aufruf von WSAEventSelect erfolgt, wobei der lNetworkEvents-Parameter auf null festgelegt ist, oder bis ein Aufruf von WSAAsyncSelect erfolgt.
WSAEnumNetworkEvents meldet nur Netzwerkaktivitäten und Fehler, die über WSAEventSelect benannt wurden. In den Beschreibungen von select und WSAAsyncSelect erfahren Sie, wie diese Funktionen Netzwerkaktivitäten und Fehler melden.
Der interne Datensatz der Netzwerkereignisse des Sockets wird in die Struktur kopiert, auf die von lpNetworkEvents verwiesen wird, worauf der interne Netzwerkereignisdatensatz gelöscht wird. Wenn der hEventObject-Parameter nicht NULL ist, wird auch das angegebene Ereignisobjekt zurückgesetzt. Der Windows Sockets-Anbieter garantiert, dass die Vorgänge zum Kopieren des Netzwerkereignisdatensatzes, Zum Löschen und Zurücksetzen eines zugeordneten Ereignisobjekts atomar sind, sodass das nächste Vorkommen eines nominierten Netzwerkereignisses dazu führt, dass das Ereignisobjekt festgelegt wird. Im Fall, dass diese Funktion SOCKET_ERROR zurückgibt, wird das zugeordnete Ereignisobjekt nicht zurückgesetzt, und der Datensatz der Netzwerkereignisse wird nicht gelöscht.
Das lNetworkEvents-Element der WSANETWORKEVENTS-Struktur gibt an, welche der FD_XXX Netzwerkereignisse aufgetreten sind. Das iErrorCode-Array wird verwendet, um alle zugeordneten Fehlercodes mit dem Arrayindex zu enthalten, der der Position der Ereignisbits in lNetworkEvents entspricht. Bezeichner wie FD_READ_BIT und FD_WRITE_BIT können zum Indizieren des iErrorCode-Arrays verwendet werden. Beachten Sie, dass nur die Elemente des iErrorCode-Arrays festgelegt sind, die den im lNetworkEvents-Parameter festgelegten Bits entsprechen. Andere Parameter werden nicht geändert (dies ist wichtig für die Abwärtskompatibilität mit anwendungen, die keine neuen FD_ROUTING_INTERFACE_CHANGE und FD_ADDRESS_LIST_CHANGE Ereignisse kennen).
Die folgenden Fehlercodes können zusammen mit dem entsprechenden Netzwerkereignis zurückgegeben werden.
Ereignis: FD_CONNECT
Fehlercode | Bedeutung |
---|---|
WSAEAFNOSUPPORT | Adressen in der angegebenen Adressfamilie können nicht mit diesem Socket verwendet werden. |
WSAECONNREFUSED | Die Zurückweisung des Verbindungsversuchs wurde erzwungen. |
WSAENETUNREACH | Das Netzwerk kann von diesem Host zurzeit nicht erreicht werden. |
WSAENOBUFS | Es ist kein Pufferplatz verfügbar. Der Socket kann nicht verbunden werden. |
WSAETIMEDOUT | Zeitüberschreitung beim Verbindungsversuch, ohne eine Verbindung herzustellen |
Ereignis: FD_CLOSE
Fehlercode | Bedeutung |
---|---|
WSAENETDOWN | Fehler beim Netzwerksubsystem. |
WSAECONNRESET | Die Verbindung wurde von der Remoteseite zurückgesetzt. |
WSAECONNABORTED | Die Verbindung wurde aufgrund eines Timeouts oder eines anderen Fehlers beendet. |
Ereignis: FD_ACCEPT
Ereignis: FD_ADDRESS_LIST_CHANGE
Ereignis: FD_GROUP_QOS
Ereignis: FD_QOS
Ereignis: FD_OOB
Ereignis: FD_READ
Ereignis: FD_WRITE
Fehlercode | Bedeutung |
---|---|
WSAENETDOWN | Fehler beim Netzwerksubsystem. |
Ereignis: FD_ROUTING_INTERFACE_CHANGE
Fehlercode | Bedeutung |
---|---|
WSAENETUNREACH | Das angegebene Ziel ist nicht mehr erreichbar. |
WSAENETDOWN | Fehler beim Netzwerksubsystem. |
Beispielcode
Im folgenden Beispiel wird die Verwendung der WSAEnumNetworkEvents-Funktion veranschaulicht.#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: Diese Funktion wird für Windows Phone Store-Apps ab Windows Phone 8 unterstützt.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | winsock2.h |
Bibliothek | Ws2_32.lib |
DLL | Ws2_32.dll |