Share via


IP_ADAPTER_ADDRESSES_LH 結構 (iptypes.h)

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

類型: 結構_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]

介面卡的 Media 存取控制 (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
已針對 NetBIOS over TCP/IP 啟用配接器。
注意 只有在已針對 NTDDI 版本等於或大於 NTDDI_LONGHORN的目標平臺編譯應用程式時,Windows Vista 和更新版本才支援此旗標。 此旗標定義在 IP_ADAPTER_ADDRESSES_LH 結構中,作為 NetbiosOverTcpipEnabled bitfield。
 
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

由網際網路指派名稱授權單位所定義的介面類別型, (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 的無線區域網路 API for 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,則此成員為零。

注意 此結構成員僅適用于 Windows XP SP1 和更新版本。
 

ZoneIndices[16]

類型: DWORD[16]

用於撰寫 sockaddr 結構之每個範圍層級的範圍識別碼陣列。 SCOPE_LEVEL列舉是用來編制陣列的索引。 在 IPv6 上,單一介面可能會根據範圍識別碼指派多個 IPv6 多播位址。

注意 此結構成員僅適用于 Windows XP SP1 和更新版本。
 

FirstPrefix

類型: PIP_ADAPTER_PREFIX

介面卡之 IP 配接器前置詞連結清單中的第一 個IP_ADAPTER_PREFIX 結構的指標。

注意 此結構成員僅適用于 Windows XP SP1 和更新版本。
 

TransmitLinkSpeed

類型: ULONG64

介面卡傳輸連結每秒位的目前速度。

注意 此結構成員僅適用于 Windows Vista 和更新版本。
 

ReceiveLinkSpeed

類型: ULONG64

介面卡接收連結每秒位的目前速度。

注意 此結構成員僅適用于 Windows Vista 和更新版本。
 

FirstWinsServerAddress

類型: PIP_ADAPTER_WINS_SERVER_ADDRESS_LH

Windows 網際網路名稱服務連結清單中的第一個 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結構之計量成員中指定的路由計量位移總和,以及 IPv4 在此成員中指定的介面計量。

注意 此結構成員僅適用于 Windows Vista 和更新版本。
 

Ipv6Metric

類型: ULONG

介面卡位址的 IPv6 介面計量。 此成員僅適用于 IPv6 配接器位址。

用來計算 IPv6 路由喜好設定的實際路由計量是MIB_IPFORWARD_ROW2結構之計量成員中指定的路由計量位移總和,以及 IPv4 在此成員中指定的介面計量。

注意 此結構成員僅適用于 Windows Vista 和更新版本。
 

Luid

類型: IF_LUID

介面卡位址的介面 LUID。

注意 此結構成員僅適用于 Windows Vista 和更新版本。
 

Dhcpv4Server

類型: SOCKET_ADDRESS

介面卡位址之 DHCP 伺服器的 IPv4 位址。 此成員僅適用于使用 DHCP 設定的 IPv4 介面卡位址。

注意 此結構成員僅適用于 Windows Vista 和更新版本。
 

CompartmentId

類型: NET_IF_COMPARTMENT_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 和更新版本。
 
通道類型是由網際網路指派名稱授權單位 (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 封包的 IP over HTTPS 封裝。
注意 此列舉值僅適用于 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]

DHCPv6 用戶端的 DHCP 唯一識別碼 (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 上的 IP_ADAPTER_ADDRESSES 結構大小也會隨著 SP1 和更新版本和 Windows Server 2008 和更新版本而變更。 Length成員應該用來判斷正在使用哪一個版本的IP_ADAPTER_ADDRESSES結構。

Windows XP SP1 和更新版本上的 IP_ADAPTER_ADDRESSES 結構版本新增了下列新成員: Ipv6IfIndexZoneIndicesFirstPrefix

Windows Vista 和更新版本上的IP_ADAPTER_ADDRESSES結構版本新增了下列成員:TransmitLinkSpeedReceiveLinkSpeedFirstWinsServerAddressFirstGatewayAddressIpv4Metric、Ipv6MetricLuidDhcpv4ServerCompartmentIdNetworkGuidConnectionType、TunnelTypeDhcpv6Server、Dhcpv6ClientDuidDhcpv6ClientDuidLengthDhcpv6Iaid

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 位址首碼。 此外,每個介面卡都有多播位址首碼和廣播位址首碼。

在 Windows XP 上,SP1 和更新版本在 Windows Vista 之前,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結構定義在Winsock2.h標頭檔自動包含的Ws2def.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