Gestione delle schede di rete tramite GetAdaptersInfo
La funzione GetAdaptersInfo riempie un puntatore a una struttura IP_ADAPTER_INFO con informazioni sulle schede di rete associate al sistema.
Per usare GetAdaptersInfo
Dichiarare un puntatore a una variabile IP_ADAPTER_INFO denominata pAdapterInfo e una variabile ULONG denominata ulOutBufLen. Queste variabili vengono passate come parametri alla funzione GetAdaptersInfo . Creare anche una variabile DWORD denominata dwRetVal (per il controllo degli errori).
IP_ADAPTER_INFO *pAdapterInfo; ULONG ulOutBufLen; DWORD dwRetVal;
Allocare memoria per le strutture.
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) ); ulOutBufLen = sizeof(IP_ADAPTER_INFO);
Effettuare una chiamata iniziale a GetAdaptersInfo per ottenere le dimensioni necessarie nella variabile ulOutBufLen .
Nota
Questa chiamata alla funzione deve avere esito negativo e viene usata per garantire che la variabile ulOutBufLen specifichi una dimensione sufficiente per contenere tutte le informazioni restituite a pAdapterInfo. Si tratta di un modello di programmazione comune per le strutture di dati e le funzioni di questo tipo.
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) { free (pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) malloc ( ulOutBufLen ); }
Effettuare una seconda chiamata a GetAdaptersInfo, passando pAdapterInfo e ulOutBufLen come parametri ed eseguendo il controllo degli errori generale. Restituisce il relativo valore alla variabile DWORD dwRetVal (per un controllo degli errori più completo).
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS) { printf("GetAdaptersInfo call failed with %d\n", dwRetVal); }
Se la chiamata ha avuto esito positivo, accedere ad alcuni dei dati nella struttura 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; }
Liberare qualsiasi memoria allocata per la struttura pAdapterInfo .
if (pAdapterInfo) free(pAdapterInfo);
Passaggio successivo: Gestione delle interfacce tramite GetInterfaceInfo
Passaggio precedente: Recupero di informazioni tramite GetNetworkParams