IP_ADAPTER_ADDRESSES_XP-Struktur (iptypes.h)
Die IP_ADAPTER_ADDRESSES-Struktur ist der Headerknoten für eine verknüpfte Liste von Adressen für einen bestimmten Adapter. Diese Struktur kann gleichzeitig als Teil einer verknüpften Liste von IP_ADAPTER_ADDRESSES-Strukturen verwendet werden.
Syntax
typedef struct _IP_ADAPTER_ADDRESSES_XP {
union {
ULONGLONG Alignment;
struct {
ULONG Length;
DWORD IfIndex;
};
};
struct _IP_ADAPTER_ADDRESSES_XP *Next;
PCHAR AdapterName;
PIP_ADAPTER_UNICAST_ADDRESS_XP FirstUnicastAddress;
PIP_ADAPTER_ANYCAST_ADDRESS_XP FirstAnycastAddress;
PIP_ADAPTER_MULTICAST_ADDRESS_XP FirstMulticastAddress;
PIP_ADAPTER_DNS_SERVER_ADDRESS_XP FirstDnsServerAddress;
PWCHAR DnsSuffix;
PWCHAR Description;
PWCHAR FriendlyName;
BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD PhysicalAddressLength;
DWORD Flags;
DWORD Mtu;
DWORD IfType;
IF_OPER_STATUS OperStatus;
DWORD Ipv6IfIndex;
DWORD ZoneIndices[16];
PIP_ADAPTER_PREFIX_XP FirstPrefix;
} IP_ADAPTER_ADDRESSES_XP, *PIP_ADAPTER_ADDRESSES_XP;
Members
Alignment
Typ: ULONGLONG
Reserviert. Wird vom Compiler verwendet, um die Struktur auszurichten.
Length
Typ: ULONG
Die Länge dieser Struktur in Bytes. Beachten Sie, dass sich die Länge der IP_ADAPTER_ADDRESSES-Struktur unter Windows XP mit SP1 und höher sowie unter Windows Vista und höher geändert hat.
IfIndex
Art: DWORD
Der Index der IPv4-Schnittstelle, der diese Adressen zugeordnet sind. Unter Windows Server 2003 und Windows XP ist dieser Member null, wenn IPv4 auf der Schnittstelle nicht verfügbar ist.
Next
Typ: Struktur _IP_ADAPTER_ADDRESSES*
Ein Zeiger auf die nächste Adapteradressenstruktur in der Liste.
AdapterName
Typ: PCHAR
Ein Array von Zeichen, das den Namen des Adapters enthält, dem diese Adressen zugeordnet sind. Im Gegensatz zum Anzeigenamen eines Adapters ist der in AdapterName angegebene Adaptername dauerhaft und kann vom Benutzer nicht geändert werden.
FirstUnicastAddress
Typ: PIP_ADAPTER_UNICAST_ADDRESS
Ein Zeiger auf die erste IP_ADAPTER_UNICAST_ADDRESS-Struktur in einer verknüpften Liste von IP-Unicastadressen für den Adapter.
FirstAnycastAddress
Typ: PIP_ADAPTER_ANYCAST_ADDRESS
Ein Zeiger auf die erste IP_ADAPTER_ANYCAST_ADDRESS-Struktur in einer verknüpften Liste von IP-Anycastadressen für den Adapter.
FirstMulticastAddress
Typ: PIP_ADAPTER_MULTICAST_ADDRESS
Ein Zeiger auf die erste IP_ADAPTER_MULTICAST_ADDRESS-Struktur in einer Liste der IP-Multicastadressen für den Adapter.
FirstDnsServerAddress
Typ: PIP_ADAPTER_DNS_SERVER_ADDRESS
Ein Zeiger auf die erste IP_ADAPTER_DNS_SERVER_ADDRESS-Struktur in einer verknüpften Liste von DNS-Serveradressen für den Adapter.
DnsSuffix
Typ: PWCHAR
Das DNS-Suffix (Domain Name System), das diesem Adapter zugeordnet ist.
Description
Typ: PWCHAR
Eine Beschreibung für den Adapter. Dieser Member ist schreibgeschützt.
FriendlyName
Typ: PWCHAR
Ein benutzerfreundlicher Name für den Adapter. Beispiel: "Local Area Connection 1." Dieser Name wird in Kontexten wie dem Befehlszeilenprogramm ipconfig und dem Ordner Connection angezeigt. Dieser Member ist schreibgeschützter Und kann nicht mithilfe von IP-Hilfsfunktionen geändert werden.
Dieses Element ist das ifAlias-Feld, das von NDIS verwendet wird, wie in RFC 2863 beschrieben. Das Feld ifAlias kann von einem NDIS-Schnittstellenanbieter festgelegt werden, wenn der NDIS-Treiber installiert wird. Für NDIS-Miniporttreiber wird dieses Feld von NDIS festgelegt.
PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH]
Typ: BYTE[MAX_ADAPTER_ADDRESS_LENGTH]
Die MAC-Adresse (Media Access Control) für den Adapter. In einem Ethernet-Netzwerk würde dieses Mitglied beispielsweise die Ethernet-Hardwareadresse angeben.
PhysicalAddressLength
Art: DWORD
Die Länge der im PhysicalAddress-Member angegebenen Adresse in Bytes. Für Schnittstellen ohne Datenverknüpfungsebene ist dieser Wert 0.
Flags
Art: DWORD
Ein Satz von Flags, die verschiedene Einstellungen für den Adapter angeben. Diese Werte werden in der Iptypes.h-Headerdatei definiert. Kombinationen dieser Flagbits sind möglich.
Mtu
Art: DWORD
Die maximale MTU-Größe (Transmission Unit) in Byte.
IfType
Art: DWORD
Der Schnittstellentyp, der von der Internet Assigned Names Authority (IANA) definiert ist. Mögliche Werte für den Schnittstellentyp sind in der Headerdatei Ipifcons.h aufgeführt.
In der folgenden Tabelle sind allgemeine Werte für den Schnittstellentyp aufgeführt, obwohl viele andere Werte möglich sind.
Wert | Bedeutung |
---|---|
|
Eine andere Art von Netzwerkschnittstelle. |
|
Eine Ethernet-Netzwerkschnittstelle. |
|
Eine Tokenringnetzwerkschnittstelle. |
|
Eine PPP-Netzwerkschnittstelle. |
|
Eine Software-Loopback-Netzwerkschnittstelle. |
|
Eine ATM-Netzwerkschnittstelle. |
|
Eine IEEE 802.11-Funknetzwerkschnittstelle.
Unter Windows Vista und höher werden Drahtlosnetzwerkkarten als IF_TYPE_IEEE80211 gemeldet. In früheren Versionen von Windows werden Drahtlose Netzwerkkarten als IF_TYPE_ETHERNET_CSMACD gemeldet. Unter Windows XP mit SP3 und unter Windows XP mit SP2 x86 mit installierter Wlan-LAN-API für Windows XP mit installiertem SP2 kann die WlanEnumInterfaces-Funktion verwendet werden, um Drahtlose Schnittstellen auf dem lokalen Computer aufzulisten. |
|
Eine Tunneltyp-Netzwerkschnittstelle. |
|
Eine IEEE 1394 (Firewire) Hochleistungs-serielle Busnetzwerkschnittstelle. |
OperStatus
Typ: IF_OPER_STATUS
Der operative status für die In RFC 2863 definierte Schnittstelle. Weitere Informationen finden Sie unter http://www.ietf.org/rfc/rfc2863.txt. Dieser Member kann einer der Werte aus dem IF_OPER_STATUS Enumerationstyp sein, der in der Headerdatei "Iftypes.h " definiert ist. Unter Windows Vista und höher wurden die Headerdateien neu organisiert, und diese Enumeration wird in der Headerdatei "Ifdef.h " definiert.
Ipv6IfIndex
Art: DWORD
Der Schnittstellenindex für die IPv6-IP-Adresse. Dieser Member ist 0, wenn IPv6 auf der Schnittstelle nicht verfügbar ist.
ZoneIndices[16]
Typ: DWORD[16]
Ein Array von Bereichs-IDs für jede Bereichsebene, die zum Komponieren von Sockaddr-Strukturen verwendet wird. Die SCOPE_LEVEL-Enumeration wird zum Indizieren des Arrays verwendet. In IPv6 können einer einzelnen Schnittstelle mehrere IPv6-Multicastadressen basierend auf einer Bereichs-ID zugewiesen werden.
FirstPrefix
Typ: PIP_ADAPTER_PREFIX
Ein Zeiger auf die erste IP_ADAPTER_PREFIX Struktur in einer verknüpften Liste von IP-Adapterpräfixen für den Adapter.
Hinweise
Die GetAdaptersAddresses-Funktion ruft Informationen für IPv4- und IPv6-Adressen ab und gibt diese Informationen als verknüpfte Liste von IP_ADAPTER_ADDRESSES Strukturen zurück.
Die in den Membern IfIndex und Ipv6IfIndex angegebenen Adapterindexwerte können sich ändern, wenn ein Adapter deaktiviert und dann aktiviert ist, oder unter anderen Umständen, und sollten nicht als persistent betrachtet werden.
Die Werte für das IfType-Element werden in der Headerdatei Ipifcons.h definiert. Derzeit werden nur die in der Beschreibung des IfType-Members aufgeführten möglichen Werte unterstützt.
Die Größe der IP_ADAPTER_ADDRESSES Struktur wurde unter Windows XP mit SP1 und höher geändert. Die Größe der IP_ADAPTER_ADDRESSES-Struktur hat sich auch unter Windows Vista und höher geändert. Die Größe der IP_ADAPTER_ADDRESSES-Struktur hat sich auch unter Windows Vista mit SP1 und höher sowie unter Windows Server 2008 und höher geändert. Das Length-Element sollte verwendet werden, um zu bestimmen, welche Version der IP_ADAPTER_ADDRESSES-Struktur verwendet wird.
Die Version der IP_ADAPTER_ADDRESSES-Struktur unter Windows XP mit SP1 und höher enthält die folgenden neuen Member: Ipv6IfIndex, ZoneIndices und FirstPrefix.
Die Version der IP_ADAPTER_ADDRESSES-Struktur unter Windows Vista und höher enthält die folgenden neuen Member: TransmitLinkSpeed, ReceiveLinkSpeed, FirstWinsServerAddress, FirstGatewayAddress, Ipv4Metric, Ipv6Metric, Luid, Dhcpv4Server, CompartmentId, NetworkGuid, ConnectionType, TunnelType, Dhcpv6Server, Dhcpv6ClientDuid, Dhcpv6ClientDuidLength und Dhcpv6Iaid.
Die Version der IP_ADAPTER_ADDRESSES-Struktur unter Windows Vista mit SP1 und höher sowie unter Windows Server 2008 und höher hat das folgende neue Element hinzugefügt: FirstDnsSuffix.
Die Member Ipv4Metric und Ipv6Metric werden verwendet, um Routenmetriken für Routen zu priorisieren, die mit mehreren Schnittstellen auf dem lokalen Computer verbunden sind.
Die Reihenfolge der verknüpften IP_ADAPTER_UNICAST_ADDRESS Strukturen, auf die vom FirstUnicastAddress-Member verwiesen wird, die von der GetAdaptersAddresses-Funktion zurückgegeben werden, spiegelt nicht die Reihenfolge wider, in der IP-Adressen einem Adapter hinzugefügt wurden, und kann zwischen den Versionen von Windows variieren. Ebenso geben die Reihenfolge der verknüpften IP_ADAPTER_ANYCAST_ADDRESS Strukturen, auf die vom FirstAnycastAddress-Member verwiesen wird, und die Reihenfolge der verknüpften IP_ADAPTER_MULTICAST_ADDRESS Strukturen, auf die das FirstMulticastAddress-Element verweist, nicht die Reihenfolge wider, in der IP-Adressen einem Adapter hinzugefügt wurden, und können zwischen den Versionen von Windows variieren.
Darüber hinaus werden die verknüpften IP_ADAPTER_UNICAST_ADDRESS Strukturen, auf die das FirstUnicastAddress-Element verweist, und die verknüpften IP_ADAPTER_PREFIX Strukturen, auf die das FirstPrefix-Element verweist, vom Betriebssystem als separate interne verknüpfte Listen verwaltet. Daher hat die Reihenfolge der verknüpften IP_ADAPTER_UNICAST_ADDRESS Strukturen, auf die das FirstUnicastAddress-Element verweist, keine Beziehung zur Reihenfolge der verknüpften IP_ADAPTER_PREFIX Strukturen, auf die das FirstPrefix-Element verweist.
Unter Windows Vista und höher enthalten die verknüpften IP_ADAPTER_PREFIX Strukturen, auf die das FirstPrefix-Element verweist, drei IP-Adapterpräfixe für jede dem Adapter zugewiesene IP-Adresse. Dazu gehören das Präfix der Host-IP-Adresse, das Subnetz-IP-Adresspräfix und das Subnetz-Broadcast-IP-Adresspräfix. Darüber hinaus gibt es für jeden Adapter ein Multicastadressenpräfix und ein Broadcastadressenpräfix.
Unter Windows XP mit SP1 und höher vor Windows Vista enthalten die verknüpften IP_ADAPTER_PREFIX Strukturen, auf die das FirstPrefix-Element verweist, nur ein einzelnes IP-Adapterpräfix für jede DEM Adapter zugewiesene IP-Adresse.
Im Windows SDK wird die Version der Struktur für die Verwendung unter Windows Vista und höher als IP_ADAPTER_ADDRESSES_LH definiert. Im Microsoft Windows Software Development Kit (SDK) wird die Version dieser Struktur, die auf früheren Systemen verwendet werden soll, einschließlich Windows XP mit SP1 und höher, als IP_ADAPTER_ADDRESSES_XP definiert. Beim Kompilieren einer Anwendung, wenn die Zielplattform Windows Vista und höher (NTDDI_VERSION >= NTDDI_LONGHORN
, oder WINVER >= 0x0600
) ist, _WIN32_WINNT >= 0x0600
wird die IP_ADAPTER_ADDRESSES_LH-Struktur in die IP_ADAPTER_ADDRESSES-Struktur typedefeded. Wenn eine Anwendung kompiliert wird, wenn die Zielplattform nicht Windows Vista und höher ist, wird die IP_ADAPTER_ADDRESSES_XP-Struktur in die IP_ADAPTER_ADDRESSES-Struktur eingegeben.
Die SOCKET_ADDRESS-Struktur wird in der IP_ADAPTER_ADDRESSES-Struktur verwendet. Im Windows SDK, das für Windows Vista und höher veröffentlicht wurde, wurde die organization der Headerdateien geändert, und die SOCKET_ADDRESS-Struktur wird in der Headerdatei Ws2def.h definiert, die automatisch von der Winsock2.h-Headerdatei eingeschlossen wird. Im Platform Software Development Kit (SDK), das für Windows Server 2003 und Windows XP veröffentlicht wurde, wird die SOCKET_ADDRESS-Struktur in der Winsock2.h-Headerdatei deklariert. Um die IP_ADAPTER_ADDRESSES-Struktur verwenden zu können, muss die Winsock2.h-Headerdatei vor der Headerdatei Iphlpapi.h enthalten sein.
Beispiele
In diesem Beispiel wird die IP_ADAPTER_ADDRESSES-Struktur für die dem System zugeordneten Adapter abgerufen und einige Member für jede Adapterschnittstelle ausgegeben.
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "IPHLPAPI.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 argc, char **argv)
{
/* Declare and initialize variables */
DWORD dwSize = 0;
DWORD dwRetVal = 0;
unsigned int i = 0;
// Set the flags to pass to GetAdaptersAddresses
ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
// default to unspecified address family (both)
ULONG family = AF_UNSPEC;
LPVOID lpMsgBuf = NULL;
PIP_ADAPTER_ADDRESSES pAddresses = NULL;
ULONG outBufLen = 0;
PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
IP_ADAPTER_PREFIX *pPrefix = NULL;
if (argc != 2) {
printf(" Usage: getadapteraddresses family\n");
printf(" getadapteraddresses 4 (for IPv4)\n");
printf(" getadapteraddresses 6 (for IPv6)\n");
printf(" getadapteraddresses A (for both IPv4 and IPv6)\n");
exit(1);
}
if (atoi(argv[1]) == 4)
family = AF_INET;
else if (atoi(argv[1]) == 6)
family = AF_INET6;
outBufLen = sizeof (IP_ADAPTER_ADDRESSES);
pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
// Make an initial call to GetAdaptersAddresses to get the
// size needed into the outBufLen variable
if (GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen)
== ERROR_BUFFER_OVERFLOW) {
FREE(pAddresses);
pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
}
if (pAddresses == NULL) {
printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
exit(1);
}
// Make a second call to GetAdapters Addresses to get the
// actual data we want
printf("Memory allocated for GetAdapterAddresses = %d bytes\n", outBufLen);
printf("Calling GetAdaptersAddresses function with family = ");
if (family == AF_INET)
printf("AF_INET\n");
if (family == AF_INET6)
printf("AF_INET6\n");
if (family == AF_UNSPEC)
printf("AF_UNSPEC\n\n");
dwRetVal =
GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);
if (dwRetVal == NO_ERROR) {
// If successful, output some information from the data we received
pCurrAddresses = pAddresses;
while (pCurrAddresses) {
printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n",
pCurrAddresses->Length);
printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);
pUnicast = pCurrAddresses->FirstUnicastAddress;
if (pUnicast != NULL) {
for (i = 0; pUnicast != NULL; i++)
pUnicast = pUnicast->Next;
printf("\tNumber of Unicast Addresses: %d\n", i);
} else
printf("\tNo Unicast Addresses\n");
pAnycast = pCurrAddresses->FirstAnycastAddress;
if (pAnycast) {
for (i = 0; pAnycast != NULL; i++)
pAnycast = pAnycast->Next;
printf("\tNumber of Anycast Addresses: %d\n", i);
} else
printf("\tNo Anycast Addresses\n");
pMulticast = pCurrAddresses->FirstMulticastAddress;
if (pMulticast) {
for (i = 0; pMulticast != NULL; i++)
pMulticast = pMulticast->Next;
printf("\tNumber of Multicast Addresses: %d\n", i);
} else
printf("\tNo Multicast Addresses\n");
pDnServer = pCurrAddresses->FirstDnsServerAddress;
if (pDnServer) {
for (i = 0; pDnServer != NULL; i++)
pDnServer = pDnServer->Next;
printf("\tNumber of DNS Server Addresses: %d\n", i);
} else
printf("\tNo DNS Server Addresses\n");
printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix);
printf("\tDescription: %wS\n", pCurrAddresses->Description);
printf("\tFriendly name: %wS\n", pCurrAddresses->FriendlyName);
if (pCurrAddresses->PhysicalAddressLength != 0) {
printf("\tPhysical address: ");
for (i = 0; i < pCurrAddresses->PhysicalAddressLength;
i++) {
if (i == (pCurrAddresses->PhysicalAddressLength - 1))
printf("%.2X\n",
(int) pCurrAddresses->PhysicalAddress[i]);
else
printf("%.2X-",
(int) pCurrAddresses->PhysicalAddress[i]);
}
}
printf("\tFlags: %ld\n", pCurrAddresses->Flags);
printf("\tMtu: %lu\n", pCurrAddresses->Mtu);
printf("\tIfType: %ld\n", pCurrAddresses->IfType);
printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus);
printf("\tIpv6IfIndex (IPv6 interface): %u\n",
pCurrAddresses->Ipv6IfIndex);
printf("\tZoneIndices (hex): ");
for (i = 0; i < 16; i++)
printf("%lx ", pCurrAddresses->ZoneIndices[i]);
printf("\n");
pPrefix = pCurrAddresses->FirstPrefix;
if (pPrefix) {
for (i = 0; pPrefix != NULL; i++)
pPrefix = pPrefix->Next;
printf("\tNumber of IP Adapter Prefix entries: %d\n", i);
} else
printf("\tNo IP Adapter Prefix entries\n");
printf("\n");
pCurrAddresses = pCurrAddresses->Next;
}
} else {
printf("Call to GetAdaptersAddresses failed with error: %d\n",
dwRetVal);
if (dwRetVal == ERROR_NO_DATA)
printf("\tNo addresses were found for the requested parameters\n");
else {
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);
FREE(pAddresses);
exit(1);
}
}
}
FREE(pAddresses);
return 0;
}
Anforderungen
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Kopfzeile | iptypes.h (include Iphlpapi.h) |
Weitere Informationen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für