Gestione delle interfacce tramite GetInterfaceInfo
La funzione GetInterfaceInfo riempie un puntatore a una struttura IP_INTERFACE_INFO con informazioni sulle interfacce associate al sistema.
Per usare getInterfaceInfo
Dichiarare un puntatore a un oggetto IP_INTERFACE_INFO denominato
pInfo
e un oggetto ULONG denominatoulOutBufLen
. Dichiarare anche un oggetto DWORD denominatodwRetVal
(usato per il controllo degli errori).ULONG ulOutBufLen; DWORD dwRetVal; unsigned int i; IP_INTERFACE_INFO* pInterfaceInfo;
Allocare memoria per le strutture.
Nota
Le dimensioni di
ulOutBufLen
non sono sufficienti per contenere le informazioni. Vedere il passaggio successivo.pInterfaceInfo = (IP_INTERFACE_INFO *) malloc(sizeof (IP_INTERFACE_INFO)); ulOutBufLen = sizeof(IP_INTERFACE_INFO);
Effettuare una chiamata iniziale a GetInterfaceInfo per ottenere le dimensioni necessarie nella variabile
ulOutBufLen
.Nota
Questa chiamata alla funzione è intenzionalmente destinata a fallire ed è utilizzata per garantire che la variabile
ulOutBufLen
specifichi una dimensione sufficiente per contenere tutte le informazioni restituite apInfo
. Si tratta di un modello di programmazione comune nell'helper IP per le strutture di dati e le funzioni di questo tipo.if (GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER) { free(pInterfaceInfo); pInterfaceInfo = (IP_INTERFACE_INFO *) malloc(ulOutBufLen); }
Effettuare una seconda chiamata a GetInterfaceInfo con il controllo degli errori generale e restituirne il valore all'
dwRetVal
variabile DWORD (per un controllo degli errori più avanzato).if ((dwRetVal = GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen)) != NO_ERROR) { printf(" GetInterfaceInfo failed with error: %d\n", dwRetVal); }
Se la chiamata ha avuto esito positivo, accedere ai dati dalla struttura dei dati
pInfo
.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); } }
Nota
Il %ws nella prima riga indica una stringa larga. Viene utilizzato perché l'attributo name della struttura IP_ADAPTER_INDEX_MAP
Adapter
è un WCHAR, che è una stringa Unicode.Liberare tutta la memoria allocata per la struttura pInfo .
if (pInterfaceInfo) { free(pInterfaceInfo); pInterfaceInfo = NULL; }
Passaggio successivo: gestione degli indirizzi IP tramite GetIpAddrTable
Passaggio precedente: Gestione delle schede di rete tramite GetAdaptersInfo