Função WSAEnumNetworkEvents (winsock2.h)
A função WSAEnumNetworkEvents descobre ocorrências de eventos de rede para o soquete indicado, limpar registros de eventos de rede internos e redefinir objetos de evento (opcional).
Sintaxe
int WSAAPI WSAEnumNetworkEvents(
[in] SOCKET s,
[in] WSAEVENT hEventObject,
[out] LPWSANETWORKEVENTS lpNetworkEvents
);
Parâmetros
[in] s
Um descritor que identifica o soquete.
[in] hEventObject
Um identificador opcional que identifica um objeto de evento associado a ser redefinido.
[out] lpNetworkEvents
Um ponteiro para uma estrutura WSANETWORKEVENTS que é preenchida com um registro de eventos de rede que ocorreram e quaisquer códigos de erro associados.
Retornar valor
O valor retornado será zero se a operação tiver sido bem-sucedida. Caso contrário, o valor SOCKET_ERROR será retornado e um número de erro específico poderá ser recuperado chamando WSAGetLastError.
Código do erro | Significado |
---|---|
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função. | |
O subsistema de rede falhou. | |
Um dos parâmetros especificados era inválido. | |
Uma chamada de bloqueio do Windows Sockets 1.1 está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada. | |
O descritor não é um soquete. | |
O parâmetro lpNetworkEvents não é uma parte válida do espaço de endereço do usuário. |
Comentários
A função WSAEnumNetworkEvents é usada para descobrir quais eventos de rede ocorreram para o soquete indicado desde a última invocação dessa função. Ele destina-se ao uso em conjunto com WSAEventSelect, que associa um objeto de evento a um ou mais eventos de rede. A gravação de eventos de rede começa quando WSAEventSelect é chamado com um parâmetro lNetworkEvents diferente de zero e permanece em vigor até que outra chamada seja feita para WSAEventSelect com o parâmetro lNetworkEvents definido como zero ou até que uma chamada seja feita para WSAAsyncSelect.
O WSAEnumNetworkEvents relata apenas a atividade de rede e os erros indicados por meio de WSAEventSelect. Confira as descrições de select e WSAAsyncSelect para descobrir como essas funções relatam erros e atividades de rede.
O registro interno do soquete de eventos de rede é copiado para a estrutura referenciada por lpNetworkEvents, após a qual o registro de eventos de rede interna é limpo. Se o parâmetro hEventObject não for NULL, o objeto de evento indicado também será redefinido. O provedor do Windows Sockets garante que as operações de copiar o registro de evento de rede, limpá-lo e redefinir qualquer objeto de evento associado sejam atômicas, de modo que a próxima ocorrência de um evento de rede indicado faça com que o objeto de evento seja definido. No caso dessa função retornar SOCKET_ERROR, o objeto de evento associado não é redefinido e o registro de eventos de rede não é limpo.
O membro lNetworkEvents da estrutura WSANETWORKEVENTS indica qual dos eventos de rede FD_XXX ocorreram. A matriz iErrorCode é usada para conter quaisquer códigos de erro associados com o índice de matriz correspondente à posição dos bits de evento em lNetworkEvents. Identificadores como FD_READ_BIT e FD_WRITE_BIT podem ser usados para indexar a matriz iErrorCode . Observe que somente os elementos da matriz iErrorCode são definidos que correspondem aos bits definidos no parâmetro lNetworkEvents . Outros parâmetros não são modificados (isso é importante para compatibilidade com versões anteriores com os aplicativos que não estão cientes de novos eventos de FD_ROUTING_INTERFACE_CHANGE e FD_ADDRESS_LIST_CHANGE).
Os códigos de erro a seguir podem ser retornados junto com o evento de rede correspondente.
Evento: FD_CONNECT
Código do erro | Significado |
---|---|
WSAEAFNOSUPPORT | Os endereços na família especificada não podem ser usados com este soquete. |
WSAECONNREFUSED | A tentativa de conexão foi rejeitada de modo forçado. |
WSAENETUNREACH | A rede não pode ser alcançada através deste host neste momento. |
WSAENOBUFS | Nenhum espaço de buffer disponível. O soquete não pode ser conectado. |
WSAETIMEDOUT | Uma tentativa de conexão atingiu o tempo limite sem estabelecer uma conexão |
Evento: FD_CLOSE
Código do erro | Significado |
---|---|
WSAENETDOWN | O subsistema de rede falhou. |
WSAECONNRESET | A conexão foi redefinida pelo lado remoto. |
WSAECONNABORTED | A conexão foi encerrada devido a um tempo limite ou outra falha. |
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 do erro | Significado |
---|---|
WSAENETDOWN | O subsistema de rede falhou. |
Evento: FD_ROUTING_INTERFACE_CHANGE
Código do erro | Significado |
---|---|
WSAENETUNREACH | O destino especificado não é mais acessível. |
WSAENETDOWN | O subsistema de rede falhou. |
Código de exemplo
O exemplo a seguir demonstra o uso da função 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: essa função tem suporte para aplicativos da Windows Phone Store no Windows Phone 8 e posterior.
Windows 8.1 e Windows Server 2012 R2: essa função tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posteriores.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 8.1, Windows Vista [aplicativos da área de trabalho | Aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | winsock2.h |
Biblioteca | Ws2_32.lib |
DLL | Ws2_32.dll |