Gerenciando adaptadores de rede usando GetAdaptersInfo
A função GetAdaptersInfo preenche um ponteiro para uma estrutura IP_ADAPTER_INFO com informações sobre os adaptadores de rede associados ao sistema.
Para usar GetAdaptersInfo
Declare um ponteiro para uma variável de IP_ADAPTER_INFO chamada pAdapterInfo e uma variável ULONG chamada ulOutBufLen. Essas variáveis são passadas como parâmetros para a função GetAdaptersInfo . Crie também uma variável DWORD chamada dwRetVal (para verificação de erros).
IP_ADAPTER_INFO *pAdapterInfo; ULONG ulOutBufLen; DWORD dwRetVal;
Alocar memória para as estruturas.
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) ); ulOutBufLen = sizeof(IP_ADAPTER_INFO);
Faça uma chamada inicial para GetAdaptersInfo para obter o tamanho necessário na variável ulOutBufLen .
Observação
Essa chamada para a função deve falhar e é usada para garantir que a variável ulOutBufLen especifique um tamanho suficiente para manter todas as informações retornadas para pAdapterInfo. Esse é um modelo de programação comum para estruturas de dados e funções desse tipo.
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) { free (pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) malloc ( ulOutBufLen ); }
Faça uma segunda chamada para GetAdaptersInfo, passando pAdapterInfo e ulOutBufLen como parâmetros e fazendo verificação geral de erros. Retorne seu valor para a variável DWORDdwRetVal (para verificação de erros mais abrangente).
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS) { printf("GetAdaptersInfo call failed with %d\n", dwRetVal); }
Se a chamada tiver sido bem-sucedida, acesse alguns dos dados na estrutura pAdapterInfo .
PIP_ADAPTER_INFO pAdapter = pAdapterInfo; while (pAdapter) { printf("Adapter Name: %s\n", pAdapter->AdapterName); printf("Adapter Desc: %s\n", pAdapter->Description); printf("\tAdapter Addr: \t"); for (UINT i = 0; i < pAdapter->AddressLength; i++) { if (i == (pAdapter->AddressLength - 1)) printf("%.2X\n",(int)pAdapter->Address[i]); else printf("%.2X-",(int)pAdapter->Address[i]); } printf("IP Address: %s\n", pAdapter->IpAddressList.IpAddress.String); printf("IP Mask: %s\n", pAdapter->IpAddressList.IpMask.String); printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String); printf("\t***\n"); if (pAdapter->DhcpEnabled) { printf("\tDHCP Enabled: Yes\n"); printf("\t\tDHCP Server: \t%s\n", pAdapter->DhcpServer.IpAddress.String); } else printf("\tDHCP Enabled: No\n"); pAdapter = pAdapter->Next; }
Libere qualquer memória alocada para a estrutura pAdapterInfo .
if (pAdapterInfo) free(pAdapterInfo);
Próxima etapa: gerenciando interfaces usando GetInterfaceInfo
Etapa anterior: recuperando informações usando GetNetworkParams