Gerenciando interfaces usando GetInterfaceInfo
A função GetInterfaceInfo preenche um ponteiro para uma estrutura IP_INTERFACE_INFO com informações sobre as interfaces associadas ao sistema.
Para usar GetInterfaceInfo
Declare um ponteiro para um objeto IP_INTERFACE_INFO chamado
pInfo
e um objeto ULONG chamadoulOutBufLen
. Declare também um objeto DWORD chamadodwRetVal
(usado para verificação de erros).ULONG ulOutBufLen; DWORD dwRetVal; unsigned int i; IP_INTERFACE_INFO* pInterfaceInfo;
Alocar memória para as estruturas.
Observação
O tamanho de
ulOutBufLen
não é suficiente para manter as informações. Consulte a próxima etapa.pInterfaceInfo = (IP_INTERFACE_INFO *) malloc(sizeof (IP_INTERFACE_INFO)); ulOutBufLen = sizeof(IP_INTERFACE_INFO);
Faça uma chamada inicial para GetInterfaceInfo para obter o tamanho necessário para a
ulOutBufLen
variável.Observação
Essa chamada para a função deve falhar e é usada para garantir que a
ulOutBufLen
variável especifique um tamanho suficiente para manter todas as informações retornadas parapInfo
. Esse é um modelo de programação comum no Auxiliar de IP para estruturas de dados e funções desse tipo.if (GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER) { free(pInterfaceInfo); pInterfaceInfo = (IP_INTERFACE_INFO *) malloc(ulOutBufLen); }
Faça uma segunda chamada para GetInterfaceInfo com verificação de erro geral e retorne seu valor para a variável
dwRetVal
DWORD (para verificação de erro mais avançada).if ((dwRetVal = GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen)) != NO_ERROR) { printf(" GetInterfaceInfo failed with error: %d\n", dwRetVal); }
Se a chamada tiver sido bem-sucedida, acesse os dados da
pInfo
estrutura de dados.printf(" GetInterfaceInfo succeeded.\n"); printf(" Num Adapters: %ld\n\n", pInterfaceInfo->NumAdapters); for (i = 0; i < (unsigned int) pInterfaceInfo->NumAdapters; i++) { printf(" Adapter Index[%d]: %ld\n", i, pInterfaceInfo->Adapter[i].Index); printf(" Adapter Name[%d]: %ws\n\n", i, pInterfaceInfo->Adapter[i].Name); } }
Observação
O %ws na primeira linha indica uma cadeia de caracteres larga. Isso é usado porque o atributo Name da estrutura
Adapter
IP_ADAPTER_INDEX_MAP é um WCHAR, que é uma cadeia de caracteres Unicode.Libere qualquer memória alocada para a estrutura pInfo .
if (pInterfaceInfo) { free(pInterfaceInfo); pInterfaceInfo = NULL; }
Próxima etapa: gerenciar endereços IP usando GetIpAddrTable
Etapa anterior: gerenciando adaptadores de rede usando GetAdaptersInfo