GetIpAddrTable-Funktion (iphlpapi.h)
Die GetIpAddrTable-Funktion ruft die Zuordnungstabelle für schnittstellenbasierte IPv4-Adressen ab.
Syntax
IPHLPAPI_DLL_LINKAGE DWORD GetIpAddrTable(
[out] PMIB_IPADDRTABLE pIpAddrTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
Parameter
[out] pIpAddrTable
Ein Zeiger auf einen Puffer, der die IPv4-Adresszuordnungstabelle der Schnittstelle als MIB_IPADDRTABLE-Struktur empfängt.
[in, out] pdwSize
Gibt bei der Eingabe die Größe des Puffers in Bytes an, auf den der pIpAddrTable-Parameter verweist.
Wenn der Puffer bei der Ausgabe nicht groß genug ist, um die zurückgegebene Zuordnungstabelle aufzunehmen, legt die Funktion diesen Parameter auf die erforderliche Puffergröße in Bytes fest.
[in] bOrder
Wenn dieser Parameter TRUE ist, wird die zurückgegebene Zuordnungstabelle in aufsteigender Reihenfolge nach IPv4-Adresse sortiert. Die Sortierung erfolgt in Netzwerkbytereihenfolge. Beispielsweise kommt 10.0.0.255 unmittelbar vor 10.0.1.0.
Rückgabewert
Wenn die Funktion erfolgreich ist, wird der Rückgabewert NO_ERROR.
Wenn die Funktion fehlschlägt, ist der Rückgabewert einer der folgenden Fehlercodes.
Rückgabecode | Beschreibung |
---|---|
|
Der Puffer, auf den der pIpAddrTable-Parameter verweist, ist nicht groß genug. Die erforderliche Größe wird in der DWORD-Variablen zurückgegeben, auf die der pdwSize-Parameter verweist. |
|
Der pdwSize-Parameter ist NULL, oder GetIpAddrTable kann nicht in den Arbeitsspeicher schreiben, auf den der pdwSize-Parameter verweist. |
|
Diese Funktion wird auf dem Betriebssystem, das auf dem lokalen System verwendet wird, nicht unterstützt. |
|
Verwenden Sie FormatMessage , um die Nachrichtenzeichenfolge für den zurückgegebenen Fehler abzurufen. |
Hinweise
Die GetIpAddrTable-Funktion ruft die IPv4-Adresszuordnungstabelle der Schnittstelle auf einem lokalen Computer ab und gibt diese Informationen in einer MIB_IPADDRTABLE-Struktur zurück.
Die von der GetIpAddrTable-Funktion zurückgegebenen IPv4-Adressen werden von der status der Netzwerkschnittstellen auf einem lokalen Computer beeinflusst. Das manuelle Zurücksetzen einer Netzwerkschnittstelle Karte (NIC) und bestimmter PnP-Ereignisse kann dazu führen, dass eine IP-Adresse entfernt oder geändert wird.
Unter Windows Server 2003 und Windows XP sind auch die von der GetIpAddrTable-Funktion zurückgegebenen IPv4-Adressen betroffen, wenn die Mediensensorfunktion des TCP/IP-Stapels auf einem lokalen Computer durch Aufrufen der DisableMediaSense-Funktion deaktiviert wurde. Wenn die Medienerkennung deaktiviert wurde, gibt die GetIpAddrTable-Funktion möglicherweise IPv4-Adressen zurück, die getrennten Schnittstellen zugeordnet sind. Diese Ipv4-Adressen für getrennte Schnittstellen sind nicht für die Verwendung gültig.
Unter Windows Server 2008 und Windows Vista sind die von der GetIpAddrTable-Funktion zurückgegebenen IPv4-Adressen nicht von der Mediensensorfunktion des TCP/IP-Stapels auf einem lokalen Computer betroffen. Die GetIpAddrTable-Funktion gibt nur gültige IPv4-Adressen zurück.
Die unter Windows XP verfügbare Funktion GetAdaptersAddresses kann verwendet werden, um sowohl IPv6- als auch IPv4-Adressen und Schnittstelleninformationen abzurufen.
Die MIB_IPADDRTABLE Struktur, die von der GetIpAddrTable-Funktion zurückgegeben wird, kann eine Auffüllung für die Ausrichtung zwischen dem dwNumEntries-Member und dem ersten MIB_IPADDRROW Arrayeintrag im Tabellenmember enthalten. Zwischen den MIB_IPADDRROW Arrayeinträgen im Tabellenmember kann auch ein Abstand für die Ausrichtung vorhanden sein. Bei jedem Zugriff auf einen MIB_IPADDRROW Arrayeintrag sollte davon ausgegangen werden, dass aufgefüllt werden kann.
Im Microsoft Windows Software Development Kit (SDK), das für Windows Vista und höher veröffentlicht wurde, wurde die organization von Headerdateien geändert, und die MIB_IPADDRROW wird in der Ipmib.h-Headerdatei nicht in der Headerdatei Iprtrmib.h definiert. Beachten Sie, dass die Ipmib.h-Headerdatei automatisch in Iprtrmib.h enthalten ist, was automatisch in der Headerdatei Iphlpapi.h enthalten ist. Die Headerdateien Ipmib.h und Iprtrmib.h sollten nie direkt verwendet werden.
Beispiele
Im folgenden Beispiel wird die IP-Adresstabelle abgerufen und dann einige Member der IP-Adresseinträge in der Tabelle ausgegeben.
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int __cdecl main()
{
int i;
/* Variables used by GetIpAddrTable */
PMIB_IPADDRTABLE pIPAddrTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
IN_ADDR IPAddr;
/* Variables used to return error message */
LPVOID lpMsgBuf;
// Before calling AddIPAddress we use GetIpAddrTable to get
// an adapter to which we can add the IP.
pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));
if (pIPAddrTable) {
// Make an initial call to GetIpAddrTable to get the
// necessary size into the dwSize variable
if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==
ERROR_INSUFFICIENT_BUFFER) {
FREE(pIPAddrTable);
pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);
}
if (pIPAddrTable == NULL) {
printf("Memory allocation failed for GetIpAddrTable\n");
exit(1);
}
}
// Make a second call to GetIpAddrTable to get the
// actual data we want
if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {
printf("GetIpAddrTable failed with error %d\n", dwRetVal);
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) & lpMsgBuf, 0, NULL)) {
printf("\tError: %s", lpMsgBuf);
LocalFree(lpMsgBuf);
}
exit(1);
}
printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries);
for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {
printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex);
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;
printf("\tIP Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask;
printf("\tSubnet Mask[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr;
printf("\tBroadCast[%d]: \t%s (%ld%)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr);
printf("\tReassembly size[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize);
printf("\tType and State[%d]:", i);
if (pIPAddrTable->table[i].wType & MIB_IPADDR_PRIMARY)
printf("\tPrimary IP Address");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DYNAMIC)
printf("\tDynamic IP Address");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DISCONNECTED)
printf("\tAddress is on disconnected interface");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DELETED)
printf("\tAddress is being deleted");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_TRANSIENT)
printf("\tTransient address");
printf("\n");
}
if (pIPAddrTable) {
FREE(pIPAddrTable);
pIPAddrTable = NULL;
}
exit(0);
}
Anforderungen
Unterstützte Mindestversion (Client) | Windows 2000 Professional [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows 2000 Server [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | iphlpapi.h |
Bibliothek | Iphlpapi.lib |
DLL | Iphlpapi.dll |