(iptypes.h) IP_ADAPTER_ADDRESSES_LH 结构

IP_ADAPTER_ADDRESSES结构是特定适配器地址链接列表的标头节点。 此结构可以同时用作 IP_ADAPTER_ADDRESSES 结构链接列表的一部分。

语法

typedef struct _IP_ADAPTER_ADDRESSES_LH {
  union {
    ULONGLONG Alignment;
    struct {
      ULONG    Length;
      IF_INDEX IfIndex;
    };
  };
  struct _IP_ADAPTER_ADDRESSES_LH    *Next;
  PCHAR                              AdapterName;
  PIP_ADAPTER_UNICAST_ADDRESS_LH     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];
  ULONG                              PhysicalAddressLength;
  union {
    ULONG Flags;
    struct {
      ULONG DdnsEnabled : 1;
      ULONG RegisterAdapterSuffix : 1;
      ULONG Dhcpv4Enabled : 1;
      ULONG ReceiveOnly : 1;
      ULONG NoMulticast : 1;
      ULONG Ipv6OtherStatefulConfig : 1;
      ULONG NetbiosOverTcpipEnabled : 1;
      ULONG Ipv4Enabled : 1;
      ULONG Ipv6Enabled : 1;
      ULONG Ipv6ManagedAddressConfigurationSupported : 1;
    };
  };
  ULONG                              Mtu;
  IFTYPE                             IfType;
  IF_OPER_STATUS                     OperStatus;
  IF_INDEX                           Ipv6IfIndex;
  ULONG                              ZoneIndices[16];
  PIP_ADAPTER_PREFIX_XP              FirstPrefix;
  ULONG64                            TransmitLinkSpeed;
  ULONG64                            ReceiveLinkSpeed;
  PIP_ADAPTER_WINS_SERVER_ADDRESS_LH FirstWinsServerAddress;
  PIP_ADAPTER_GATEWAY_ADDRESS_LH     FirstGatewayAddress;
  ULONG                              Ipv4Metric;
  ULONG                              Ipv6Metric;
  IF_LUID                            Luid;
  SOCKET_ADDRESS                     Dhcpv4Server;
  NET_IF_COMPARTMENT_ID              CompartmentId;
  NET_IF_NETWORK_GUID                NetworkGuid;
  NET_IF_CONNECTION_TYPE             ConnectionType;
  TUNNEL_TYPE                        TunnelType;
  SOCKET_ADDRESS                     Dhcpv6Server;
  BYTE                               Dhcpv6ClientDuid[MAX_DHCPV6_DUID_LENGTH];
  ULONG                              Dhcpv6ClientDuidLength;
  ULONG                              Dhcpv6Iaid;
  PIP_ADAPTER_DNS_SUFFIX             FirstDnsSuffix;
} IP_ADAPTER_ADDRESSES_LH, *PIP_ADAPTER_ADDRESSES_LH;

成员

Alignment

类型: ULONGLONG

保留。 由编译器用于对齐结构。

Length

类型: ULONG

此结构的长度(以字节为单位)。 请注意, windows XP SP1 及更高版本以及 Windows Vista 及更高版本上IP_ADAPTER_ADDRESSES结构的长度已更改。

IfIndex

类型:DWORD

与这些地址关联的 IPv4 接口的索引。 在 Windows Server 2003 和 Windows XP 上,如果接口上没有可用的 IPv4,则此成员为零。

Next

类型: struct _IP_ADAPTER_ADDRESSES*

指向列表中下一个适配器的指针地址结构。

AdapterName

类型: PCHAR

包含与这些地址关联的适配器名称的字符数组。 与适配器的友好名称不同, AdapterName 中指定的适配器名称是永久性的,不能由用户修改。

FirstUnicastAddress

类型: PIP_ADAPTER_UNICAST_ADDRESS

指向适配器 IP 单播地址链接列表中的第一个 IP_ADAPTER_UNICAST_ADDRESS 结构的指针。

FirstAnycastAddress

类型: PIP_ADAPTER_ANYCAST_ADDRESS

指向适配器 IP 任意播地址链接列表中的第一个 IP_ADAPTER_ANYCAST_ADDRESS 结构的指针。

FirstMulticastAddress

类型: PIP_ADAPTER_MULTICAST_ADDRESS

指向适配器 IP 多播地址列表中第一个 IP_ADAPTER_MULTICAST_ADDRESS 结构的指针。

FirstDnsServerAddress

类型: PIP_ADAPTER_DNS_SERVER_ADDRESS

指向适配器 DNS 服务器地址链接列表中的第一个 IP_ADAPTER_DNS_SERVER_ADDRESS 结构的指针。

DnsSuffix

类型: PWCHAR

域名系统 (与此适配器关联的 DNS) 后缀。

Description

类型: PWCHAR

适配器的说明。 此成员是只读的。

FriendlyName

类型: PWCHAR

适配器的用户友好名称。 例如:“本地连接 1。此名称显示在 ipconfig 命令行程序和 Connection 文件夹等上下文中。 此成员是只读的,不能使用任何 IP 帮助程序函数进行修改。

此成员是 NDIS 使用的 ifAlias 字段,如 RFC 2863 中所述。 安装 NDIS 驱动程序时,NDIS 接口提供程序可以设置 ifAlias 字段。 对于 NDIS 微型端口驱动程序,此字段由 NDIS 设置。

PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH]

类型: BYTE[MAX_ADAPTER_ADDRESS_LENGTH]

适配器的媒体访问控制 (MAC) 地址。 例如,在以太网网络上,此成员将指定以太网硬件地址。

PhysicalAddressLength

类型:DWORD

PhysicalAddress 成员中指定的地址的长度(以字节为单位)。 对于没有数据链接层的接口,此值为零。

Flags

类型:DWORD

一组为适配器指定各种设置的标志。 这些值在 Iptypes.h 头文件中定义。 可以组合这些标志位。

标志 含义
IP_ADAPTER_DDNS_ENABLED
0x0001
在此适配器上启用了动态 DNS。
IP_ADAPTER_REGISTER_ADAPTER_SUFFIX
0x0002
注册此适配器的 DNS 后缀。
IP_ADAPTER_DHCP_ENABLED
0x0004
在此适配器上启用了动态主机配置协议 (DHCP) 。
IP_ADAPTER_RECEIVE_ONLY
0x0008
适配器是仅限接收的适配器。
IP_ADAPTER_NO_MULTICAST
0x0010
适配器不是多播接收方。
IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG
0x0020
适配器包含其他 IPv6 特定的有状态配置信息。
IP_ADAPTER_NETBIOS_OVER_TCPIP_ENABLED
0x0040
适配器通过 TCP/IP 为 NetBIOS 启用。
注意 仅当应用程序已针对 NTDDI 版本等于或大于 NTDDI_LONGHORN 的目标平台编译时,Windows Vista 和更高版本才支持此标志。 此标志在 IP_ADAPTER_ADDRESSES_LH 结构中定义为 NetbiosOverTcpipEnabled 位域。
 
IP_ADAPTER_IPV4_ENABLED
0x0080
为 IPv4 启用适配器。
注意 仅当应用程序已针对 NTDDI 版本等于或大于 NTDDI_LONGHORN 的目标平台编译时,Windows Vista 和更高版本才支持此标志。 此标志在 IP_ADAPTER_ADDRESSES_LH 结构中定义为 Ipv4Enabled 位域。
 
IP_ADAPTER_IPV6_ENABLED
0x0100
为 IPv6 启用适配器。
注意 仅当应用程序已针对 NTDDI 版本等于或大于 NTDDI_LONGHORN 的目标平台编译时,Windows Vista 和更高版本才支持此标志。 此标志在 IP_ADAPTER_ADDRESSES_LH 结构中定义为 Ipv6Enabled 位域。
 
IP_ADAPTER_IPV6_MANAGE_ADDRESS_CONFIG
0x0200
为 IPv6 托管地址配置启用适配器。
注意 仅当应用程序已针对 NTDDI 版本等于或大于 NTDDI_LONGHORN 的目标平台编译时,Windows Vista 和更高版本才支持此标志。 此标志在 IP_ADAPTER_ADDRESSES_LH 结构中定义为 Ipv6ManagedAddressConfigurationSupported 位域。
 

DdnsEnabled

RegisterAdapterSuffix

Dhcpv4Enabled

ReceiveOnly

NoMulticast

Ipv6OtherStatefulConfig

NetbiosOverTcpipEnabled

Ipv4Enabled

Ipv6Enabled

Ipv6ManagedAddressConfigurationSupported

Mtu

类型:DWORD

最大传输单位 (MTU) 大小(以字节为单位)。

IfType

类型:DWORD

Internet 分配名称机构 (IANA) 定义的接口类型。 Ipifcons.h 头文件中列出了接口类型的可能值。

下表列出了接口类型的常见值,尽管可能还有许多其他值。

含义
IF_TYPE_OTHER
1
其他一些类型的网络接口。
IF_TYPE_ETHERNET_CSMACD
6
以太网网络接口。
IF_TYPE_ISO88025_TOKENRING
9
令牌环网络接口。
IF_TYPE_PPP
23
PPP 网络接口。
IF_TYPE_SOFTWARE_LOOPBACK
24
软件环回网络接口。
IF_TYPE_ATM
37
ATM 网络接口。
IF_TYPE_IEEE80211
71
IEEE 802.11 无线网络接口。

在 Windows Vista 及更高版本中,无线网卡报告为 IF_TYPE_IEEE80211。 在早期版本的 Windows 上,无线网卡报告为 IF_TYPE_ETHERNET_CSMACD

在装有 SP3 的 Windows XP 和安装了 SP2 的 Windows XP 的 Windows XP 上的 SP2 x86 上, WlanEnumInterfaces 函数可用于枚举本地计算机上的无线接口。

IF_TYPE_TUNNEL
131
隧道类型封装网络接口。
IF_TYPE_IEEE1394
144
IEEE 1394 (Firewire) 高性能串行总线网络接口。

OperStatus

类型: IF_OPER_STATUS

RFC 2863 中定义的接口的操作状态。 有关详细信息,请参阅 http://www.ietf.org/rfc/rfc2863.txt。 此成员可以是 iftypes.h 头文件中定义的IF_OPER_STATUS枚举类型的值之一。 在 Windows Vista 及更高版本上,头文件已重新组织,此枚举在 Ifdef.h 头文件中定义。

含义
IfOperStatusUp
1
接口已启动,并且能够传递数据包。
IfOperStatusDown
2
接口已关闭,并且不处于传递数据包的条件。 IfOperStatusDown 状态有两种含义,具体取决于 AdminStatus 成员的值。 如果 AdminStatus 未设置为 NET_IF_ADMIN_STATUS_DOWN 并且 OperStatus 设置为 IfOperStatusDown ,则假定接口上存在错误条件。 如果 AdminStatus 设置为 IfOperStatusDown,则 ifOperStatus 通常也会设置为 IfOperStatusDownIfOperStatusNotPresent ,并且接口上不一定有故障条件。
IfOperStatusTesting
3
接口处于测试模式。
IfOperStatusUnknown
4
接口的操作状态未知。
IfOperStatusDormant
5
接口实际上并不处于传递数据包的条件, (它未启动) ,而是处于挂起状态,正在等待某些外部事件。 对于按需接口,此新状态标识接口等待事件将其置于 IfOperStatusUp 状态的情况。
IfOperStatusNotPresent
6
IfOperStatusDown 状态的优化,指示相关接口已关闭,特别是因为某些组件 (通常托管系统中不存在硬件组件) 。
IfOperStatusLowerLayerDown
7
IfOperStatusDown 状态的优化。 此新状态指示此接口在一个或多个其他接口上运行,并且此接口已关闭,特别是因为这些较低层接口中的一个或多个已关闭。

Ipv6IfIndex

类型:DWORD

IPv6 IP 地址的接口索引。 如果 IPv6 在接口上不可用,则此成员为零。

注意 此结构成员仅在具有 SP1 及更高版本的 Windows XP 上可用。
 

ZoneIndices[16]

类型: DWORD[16]

用于组合 sockaddr 结构的每个范围级别的范围 ID 数组。 SCOPE_LEVEL 枚举用于为数组编制索引。 在 IPv6 上,可能会根据范围 ID 为单个接口分配多个 IPv6 多播地址。

注意 此结构成员仅在具有 SP1 及更高版本的 Windows XP 上可用。
 

FirstPrefix

类型: PIP_ADAPTER_PREFIX

指向适配器的 IP 适配器前缀链接列表中的第一个 IP_ADAPTER_PREFIX 结构的指针。

注意 此结构成员仅在具有 SP1 及更高版本的 Windows XP 上可用。
 

TransmitLinkSpeed

类型: ULONG64

适配器的传输链路的当前速度(以位/秒为单位)。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

ReceiveLinkSpeed

类型: ULONG64

适配器的接收链接的当前速度(以位/秒为单位)。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

FirstWinsServerAddress

类型: PIP_ADAPTER_WINS_SERVER_ADDRESS_LH

指向 Windows Internet 名称服务链接列表中的第一个 IP_ADAPTER_WINS_SERVER_ADDRESS 结构的指针, (适配器的 WINS) 服务器地址。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

FirstGatewayAddress

类型: PIP_ADAPTER_GATEWAY_ADDRESS_LH

指向适配器网关链接列表中的第一个 IP_ADAPTER_GATEWAY_ADDRESS 结构的指针。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

Ipv4Metric

类型: ULONG

适配器地址的 IPv4 接口指标。 此成员仅适用于 IPv4 适配器地址。

用于计算 IPv4 路由首选项的实际路由指标是MIB_IPFORWARD_ROW2结构的 Metric 成员中指定的路由指标偏移量的总和,以及此成员中为 IPv4 指定的接口指标。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

Ipv6Metric

类型: ULONG

适配器地址的 IPv6 接口指标。 此成员仅适用于 IPv6 适配器地址。

用于计算 IPv6 路由首选项的实际路由指标是MIB_IPFORWARD_ROW2结构的 Metric 成员中指定的路由指标偏移量的总和,以及此成员中为 IPv4 指定的接口指标。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

Luid

类型: IF_LUID

适配器地址的接口 LUID。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

Dhcpv4Server

类型: SOCKET_ADDRESS

适配器地址的 DHCP 服务器的 IPv4 地址。 此成员仅适用于使用 DHCP 配置的 IPv4 适配器地址。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

CompartmentId

类型: NET_IF_COMPARTMENT_ID

适配器地址的路由隔离舱 ID。

注意 此结构成员仅适用于 Windows Vista 及更高版本。 此成员当前不受支持,保留供将来使用。
 

NetworkGuid

类型: NET_IF_NETWORK_GUID

与接口所属的网络关联的 GUID

如果接口提供程序无法提供网络 GUID,则此成员可以是零 GUID。 在这种情况下,接口由 NDIS 在默认网络中注册。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

ConnectionType

类型: NET_IF_CONNECTION_TYPE

适配器地址的接口连接类型。

此成员可以是 Ifdef.h 头文件中定义的 NET_IF_CONNECTION_TYPE 枚举类型的值之一。

含义
NET_IF_CONNECTION_DEDICATED
1
连接类型是专用的。 当媒体感知为 TRUE 时,连接会自动启动。 例如,以太网连接是专用的。
NET_IF_CONNECTION_PASSIVE
2
连接类型为被动连接。 远程端必须启动与本地工作站的连接。 例如,RAS 接口是被动的。
NET_IF_CONNECTION_DEMAND
3
连接类型为 demand-dial。 此类型的连接是为了响应本地操作 (发送数据包,例如) 。
NET_IF_CONNECTION_MAXIMUM
4
NET_IF_CONNECTION_TYPE 枚举类型的最大值。 这不是 ConnectionType 成员的合法值。
 
注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

TunnelType

类型: TUNNEL_TYPE

如果适配器地址为隧道,则为隧道使用的封装方法。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 
隧道类型由 Internet 域名分配机构 (IANA) 定义。 有关详细信息,请参阅 http://www.iana.org/assignments/ianaiftype-mib。 此成员可以是 Ifdef.h 头文件中定义的 TUNNEL_TYPE 枚举类型的值之一。
含义
TUNNEL_TYPE_NONE
0
不是隧道。
TUNNEL_TYPE_OTHER
1
以下任何隧道类型都不是。
TUNNEL_TYPE_DIRECT
2
数据包直接封装在普通 IP 标头中,没有中间标头,并单播到远程隧道终结点。
TUNNEL_TYPE_6TO4
11
IPv6 数据包直接封装在 IPv4 标头中,没有中间标头,并单播到由 6to4 协议确定的目标。
TUNNEL_TYPE_ISATAP
13
IPv6 数据包直接封装在 IPv4 标头中,没有中间标头,并单播到由 ISATAP 协议确定的目标。
TUNNEL_TYPE_TEREDO
14
适用于 IPv6 数据包的 Teredo 封装。
TUNNEL_TYPE_IPHTTPS
15
IPv6 数据包的基于 HTTPS 的 IP 封装。
注意 此枚举值仅适用于 Windows 7、Windows Server 2008 R2 及更高版本。
 

Dhcpv6Server

类型: SOCKET_ADDRESS

适配器地址的 DHCPv6 服务器的 IPv6 地址。 此成员仅适用于使用 DHCPv6 配置的 IPv6 适配器地址。 此结构成员当前不受支持,保留供将来使用。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

Dhcpv6ClientDuid[MAX_DHCPV6_DUID_LENGTH]

类型: BYTE[MAX_DHCPV6_DUID_LENGTH]

DHCP 唯一标识符 (DHCPv6 客户端的 DUID) 。 此成员仅适用于使用 DHCPv6 配置的 IPv6 适配器地址。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

Dhcpv6ClientDuidLength

类型: ULONG

DHCPv6 客户端的 DHCP 唯一标识符 (DUID) 的长度(以字节为单位)。 此成员仅适用于使用 DHCPv6 配置的 IPv6 适配器地址。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

Dhcpv6Iaid

类型: ULONG

DHCPv6 客户端选择的标识关联的标识符。 此成员仅适用于使用 DHCPv6 配置的 IPv6 适配器地址。

注意 此结构成员仅适用于 Windows Vista 及更高版本。
 

FirstDnsSuffix

类型: PIP_ADAPTER_DNS_SUFFIX

指向适配器 DNS 后缀链接列表中的第一个 IP_ADAPTER_DNS_SUFFIX 结构的指针。

注意 此结构成员仅在 Windows Vista SP1 及更高版本以及 Windows Server 2008 及更高版本上可用。
 

注解

GetAdaptersAddresses 函数检索 IPv4 和 IPv6 地址的信息,并将此信息作为IP_ADAPTER_ADDRESSES结构的链接列表返回

IfIndexIpv6IfIndex 成员中指定的适配器索引值可能会在禁用然后启用适配器时发生更改,或者在其他情况下,不应被视为永久性。

IfType 成员的值在 Ipifcons.h 头文件中定义。 当前仅支持 IfType 成员的说明中列出的可能值。

windows XP SP1 及更高版本上 IP_ADAPTER_ADDRESSES 结构的大小已更改。 Windows Vista 及更高版本上 IP_ADAPTER_ADDRESSES 结构的大小也发生了变化。 在 Windows Vista SP1 及更高版本以及 Windows Server 2008 及更高版本上, IP_ADAPTER_ADDRESSES 结构的大小也发生了变化。 应使用 Length 成员来确定正在使用哪个版本的 IP_ADAPTER_ADDRESSES 结构。

Windows XP 上的 IP_ADAPTER_ADDRESSES 结构版本 SP1 及更高版本添加了以下新成员: Ipv6IfIndexZoneIndicesFirstPrefix

Windows Vista 和更高版本上的 IP_ADAPTER_ADDRESSES 结构版本添加了以下新成员: TransmitLinkSpeedReceiveLinkSpeedFirstWinsServerAddressFirstGatewayAddressIpv4MetricIpv6MetricLuidDhcpv4ServerCompartmentIdNetworkGuidConnectionTypeTunnelTypeDhcpv6ServerDhcpv6ClientDuidDhcpv6ClientDuidLengthDhcpv6Iaid

Windows Vista SP1 及更高版本以及 Windows Server 2008 及更高版本上 IP_ADAPTER_ADDRESSES 结构的版本添加了以下新成员: FirstDnsSuffix

Ipv4MetricIpv6Metric 成员用于为连接到本地计算机上的多个接口的路由设置路由指标的优先级。

由 GetAdaptersAddresses 函数返回的 FirstUnicastAddress 成员指向的链接IP_ADAPTER_UNICAST_ADDRESS结构的顺序并不反映 IP 地址添加到适配器的顺序,并且可能因 Windows 版本而异。 同样,FirstAnycastAddress 成员指向的链接IP_ADAPTER_ANYCAST_ADDRESS结构的顺序和 FirstMulticastAddress 成员指向的链接IP_ADAPTER_MULTICAST_ADDRESS结构的顺序并不反映 IP 地址添加到适配器的顺序,并且可能因 Windows 版本而异。

此外,由 FirstUnicastAddress 成员指向的链接IP_ADAPTER_UNICAST_ADDRESS结构和 FirstPrefix 成员指向的链接IP_ADAPTER_PREFIX结构由操作系统作为单独的内部链接列表进行维护。 因此,FirstUnicastAddress 成员指向的链接IP_ADAPTER_UNICAST_ADDRESS结构的顺序与 FirstPrefix 成员所指向的链接IP_ADAPTER_PREFIX结构的顺序没有任何关系。

在 Windows Vista 及更高版本上,FirstPrefix 成员指向的链接IP_ADAPTER_PREFIX结构包括分配给适配器的每个 IP 地址的三个 IP 适配器前缀。 其中包括主机 IP 地址前缀、子网 IP 地址前缀和子网广播 IP 地址前缀。 此外,每个适配器都有一个多播地址前缀和一个广播地址前缀。

在具有 SP1 及更高版本 Windows Vista 的 Windows XP 上,FirstPrefix 成员指向的链接IP_ADAPTER_PREFIX结构仅包含分配给适配器的每个 IP 地址的单个 IP 适配器前缀。

在 Windows SDK 中,用于 Windows Vista 及更高版本的 结构的版本定义为 IP_ADAPTER_ADDRESSES_LH。 在 Microsoft Windows 软件开发工具包 (SDK) 中,此结构的版本将用于早期系统(包括 Windows XP SP1 及更高版本)定义为 IP_ADAPTER_ADDRESSES_XP。 编译应用程序时,如果目标平台是 Windows Vista 且更高版本 (NTDDI_VERSION >= NTDDI_LONGHORN_WIN32_WINNT >= 0x0600WINVER >= 0x0600) ,则 IP_ADAPTER_ADDRESSES_LH 结构的类型为 IP_ADAPTER_ADDRESSES 结构。 如果目标平台不是 Windows Vista 及更高版本,则编译应用程序时, IP_ADAPTER_ADDRESSES_XP 结构的类型为 IP_ADAPTER_ADDRESSES 结构。

SOCKET_ADDRESS 结构在 IP_ADAPTER_ADDRESSES 结构中使用。 在为 Windows Vista 及更高版本发布的 Windows SDK 上,头文件的组织已更改, SOCKET_ADDRESS 结构在 Ws2def.h 头文件中定义,该文件由 Winsock2.h 头文件自动包含。 在针对 Windows Server 2003 和 Windows XP 发布的平台软件开发工具包 (SDK) 上, SOCKET_ADDRESS 结构在 Winsock2.h 头文件中声明。 若要使用 IP_ADAPTER_ADDRESSES 结构,必须在 Iphlpapi.h 头文件之前包含 Winsock2.h 头文件。

示例

此示例检索与系统关联的适配器 的IP_ADAPTER_ADDRESSES 结构,并为每个适配器接口打印一些成员。

#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 GetAdaptersAddresses 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;
}

要求

   
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
标头 iptypes.h (包括 Iphlpapi.h)

另请参阅

GetAdaptersAddresses

IF_OPER_STATUS

IP 帮助程序起始页

IP 帮助程序结构

IP_ADAPTER_ANYCAST_ADDRESS

IP_ADAPTER_DNS_SERVER_ADDRESS

IP_ADAPTER_DNS_SUFFIX

IP_ADAPTER_GATEWAY_ADDRESS

IP_ADAPTER_MULTICAST_ADDRESS

IP_ADAPTER_PREFIX

IP_ADAPTER_UNICAST_ADDRESS

IP_ADAPTER_WINS_SERVER_ADDRESS

SCOPE_LEVEL

SOCKET_ADDRESS

sockaddr