Recupero di informazioni tramite GetNetworkParams
La funzione GetNetworkParams riempie un puntatore a una struttura FIXED_INFO con dati sulle impostazioni di rete correnti.
Per usare GetNetworkParams
Dichiarare un puntatore a un oggetto FIXED_INFO denominato pFixedInfo e un oggetto ULONG denominato ulOutBufLen. Queste variabili vengono passate come parametri alla funzione GetNetworkParams . Creare anche una variabile DWORD dwRetVal (utilizzata per il controllo degli errori).
FIXED_INFO *pFixedInfo; IP_ADDR_STRING *pIPAddr; ULONG ulOutBufLen; DWORD dwRetVal;
Allocare memoria per le strutture.
Nota
Le dimensioni di ulOutBufLen non sono sufficienti per contenere le informazioni. Vedere il passaggio successivo.
pFixedInfo = (FIXED_INFO *) malloc(sizeof (FIXED_INFO)); ulOutBufLen = sizeof (FIXED_INFO);
Effettuare una chiamata iniziale a GetNetworkParams per ottenere le dimensioni necessarie per la variabile ulOutBufLen .
Nota
Questa funzione funzione avrà esito negativo e viene usata per assicurarsi che la variabile ulOutBufLen specifica una dimensione sufficiente per contenere tutti i dati restituiti a pFixedInfo. Si tratta di un modello di programmazione comune per strutture di dati e funzioni di questo tipo.
if (GetNetworkParams(pFixedInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { free(pFixedInfo); pFixedInfo = (FIXED_INFO *) malloc(ulOutBufLen); if (pFixedInfo == NULL) { printf("Error allocating memory needed to call GetNetworkParams\n"); } }
Eseguire una seconda chiamata a GetNetworkParams usando il controllo degli errori generali e restituire il relativo valore alla variabile DWORD dwRetVal; usato per il controllo degli errori più avanzato.
if (dwRetVal = GetNetworkParams(pFixedInfo, &ulOutBufLen) != NO_ERROR) { printf("GetNetworkParams failed with error %d\n", dwRetVal); if (pFixedInfo) { free(pFixedInfo); } }
Se la chiamata ha esito positivo, accedere ai dati dalla struttura di dati pFixedInfo .
printf("\tHost Name: %s\n", pFixedInfo->HostName); printf("\tDomain Name: %s\n", pFixedInfo->DomainName); printf("\tDNS Servers:\n"); printf("\t\t%s\n", pFixedInfo->DnsServerList.IpAddress.String); pIPAddr = pFixedInfo->DnsServerList.Next; while (pIPAddr) { printf("\t\t%s\n", pIPAddr->IpAddress.String); pIPAddr = pIPAddr->Next; } printf("\tNode Type: "); switch (pFixedInfo->NodeType) { case 1: printf("%s\n", "Broadcast"); break; case 2: printf("%s\n", "Peer to peer"); break; case 4: printf("%s\n", "Mixed"); break; case 8: printf("%s\n", "Hybrid"); break; default: printf("\n"); } printf("\tNetBIOS Scope ID: %s\n", pFixedInfo->ScopeId); if (pFixedInfo->EnableRouting) printf("\tIP Routing Enabled: Yes\n"); else printf("\tIP Routing Enabled: No\n"); if (pFixedInfo->EnableProxy) printf("\tWINS Proxy Enabled: Yes\n"); else printf("\tWINS Proxy Enabled: No\n"); if (pFixedInfo->EnableDns) printf("\tNetBIOS Resolution Uses DNS: Yes\n"); else printf("\tNetBIOS Resolution Uses DNS: No\n");
Liberare qualsiasi memoria allocata per la struttura pFixedInfo .
if (pFixedInfo) { free(pFixedInfo); pFixedInfo = NULL; }
Passaggio successivo: Gestione delle schede di rete tramite GetAdaptersInfo
Passaggio precedente: Creazione di un'applicazione helper IP di base