共用方式為


IP_ADAPTER_INFO結構 (iptypes.h)

IP_ADAPTER_INFO結構包含本機電腦上特定網路介面卡的相關資訊。

語法

typedef struct _IP_ADAPTER_INFO {
  struct _IP_ADAPTER_INFO *Next;
  DWORD                   ComboIndex;
  char                    AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
  char                    Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
  UINT                    AddressLength;
  BYTE                    Address[MAX_ADAPTER_ADDRESS_LENGTH];
  DWORD                   Index;
  UINT                    Type;
  UINT                    DhcpEnabled;
  PIP_ADDR_STRING         CurrentIpAddress;
  IP_ADDR_STRING          IpAddressList;
  IP_ADDR_STRING          GatewayList;
  IP_ADDR_STRING          DhcpServer;
  BOOL                    HaveWins;
  IP_ADDR_STRING          PrimaryWinsServer;
  IP_ADDR_STRING          SecondaryWinsServer;
  time_t                  LeaseObtained;
  time_t                  LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

成員

Next

類型: 結構_IP_ADAPTER_INFO*

配接器清單中的下一個介面卡指標。

ComboIndex

類型: DWORD

保留的。

AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]

類型: char[MAX_ADAPTER_NAME_LENGTH + 4]

配接器名稱的 ANSI 字元字串。

Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]

類型: char[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]

包含配接器描述的 ANSI 字元字串。

AddressLength

類型: UINT

介面卡硬體位址的長度,以位元組為單位。

Address[MAX_ADAPTER_ADDRESS_LENGTH]

類型: BYTE[MAX_ADAPTER_ADDRESS_LENGTH]

BYTE 陣列表示之介面卡的硬體位址。

Index

類型: DWORD

配接器索引。

介面卡索引可能會在停用後再啟用或在其他情況下變更,且不應視為持續性。

Type

類型: UINT

配接器類型。 介面卡類型的可能值會列在 Ipifcons.h 標頭檔中。

下表列出介面卡類型的一般值,不過 Windows Vista 和更新版本可能會有其他值。

意義
MIB_IF_TYPE_OTHER
1
一些其他類型的網路介面。
MIB_IF_TYPE_ETHERNET
6
乙太網路網路介面。
IF_TYPE_ISO88025_TOKENRING
9
MIB_IF_TYPE_TOKENRING
MIB_IF_TYPE_PPP
23
PPP 網路介面。
MIB_IF_TYPE_LOOPBACK
24
軟體回送網路介面。
MIB_IF_TYPE_SLIP
28
ATM 網路介面。
IF_TYPE_IEEE80211
71
IEEE 802.11 無線網路介面。
注意 此介面卡類型會在 Windows Vista 和更新版本上傳回。 在 Windows Server 2003 和 Windows XP 上,IEEE 802.11 無線網路介面會傳回 MIB_IF_TYPE_ETHERNET的介面卡類型。
 

DhcpEnabled

類型: UINT

選項值,指定是否為此介面卡啟用動態主機組態通訊協定 (DHCP) 。

CurrentIpAddress

類型: PIP_ADDR_STRING

保留的。

IpAddressList

類型: IP_ADDR_STRING

與此介面卡相關聯的 IPv4 地址清單,以 連結清單表示IP_ADDR_STRING 結構。 介面卡可以指派多個 IPv4 位址。

GatewayList

類型: IP_ADDR_STRING

此介面卡的 IPv4 位址,以 連結清單表示IP_ADDR_STRING 結構。 介面卡可以指派多個 IPv4 閘道位址。 此清單通常包含此介面卡預設閘道之 IPv4 位址的單一專案。

DhcpServer

類型: IP_ADDR_STRING

此介面卡的 DHCP 伺服器的 IPv4 位址,表示為 IP_ADDR_STRING 結構的連結清單。 此清單包含此介面卡之 DHCP 伺服器的 IPv4 位址的單一專案。 值為 255.255.255.255 表示無法連線到 DHCP 伺服器,或正在達到。

只有在 DhcpEnabled 成員為非零時,此成員才有效。

HaveWins

類型: BOOL

選項值,指定此介面卡是否使用 Windows 網際網路名稱服務 (WINS) 。

PrimaryWinsServer

類型: IP_ADDR_STRING

主要 WINS 伺服器的 IPv4 位址,以 連結清單表示IP_ADDR_STRING 結構。 此清單包含此介面卡主要 WINS 伺服器之 IPv4 位址的單一專案。

只有當 HaveWins 成員為 TRUE時,這個成員才有效。

SecondaryWinsServer

類型: IP_ADDR_STRING

次要 WINS 伺服器的 IPv4 位址,以 連結清單表示IP_ADDR_STRING 結構。 介面卡可以指派多個次要 WINS 伺服器位址。

只有當 HaveWins 成員為 TRUE時,這個成員才有效。

LeaseObtained

類型: time_t

取得目前 DHCP 租用的時間。

只有在 DhcpEnabled 成員為非零時,此成員才有效。

LeaseExpires

類型: time_t

目前 DHCP 租用到期的時間。

只有在 DhcpEnabled 成員為非零時,此成員才有效。

備註

IP_ADAPTER_INFO結構僅限於本機電腦上特定網路介面卡的 IPv4 資訊。 藉由呼叫GetAdaptersInfo函式來擷取IP_ADAPTER_INFO結構。

使用 Visual Studio 2005 和更新版本時, time_t 資料類型預設為 8 位元組資料類型,而不是 32 位平臺上 LeaseObtainedLeaseExpires 成員所使用的 4 位元組資料類型。 若要在 32 位平臺上正確使用 IP_ADAPTER_INFO 結構,請定義 _USE_32BIT_TIME_T ( 作為選項使用 -D _USE_32BIT_TIME_T ,例如編譯應用程式以強制time_t資料類型為 4 位元組資料類型時 )

為了在 Windows XP 和更新版本上使用, IP_ADAPTER_ADDRESSES 結構同時包含 IPv4 和 IPv6 資訊。 GetAdaptersAddresses函式會擷取 IPv4 和 IPv6 配接器資訊。

範例

此範例會擷取配接器資訊,並列印每個介面卡的各種屬性。

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.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()
{

    /* Declare and initialize variables */

// It is possible for an adapter to have multiple
// IPv4 addresses, gateways, and secondary WINS servers
// assigned to the adapter. 
//
// Note that this sample code only prints out the 
// first entry for the IP address/mask, and gateway, and
// the primary and secondary WINS server for each adapter. 

    PIP_ADAPTER_INFO pAdapterInfo;
    PIP_ADAPTER_INFO pAdapter = NULL;
    DWORD dwRetVal = 0;
    UINT i;

/* variables used to print DHCP time info */
    struct tm newtime;
    char buffer[32];
    errno_t error;

    ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
    pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO));
    if (pAdapterInfo == NULL) {
        printf("Error allocating memory needed to call GetAdaptersinfo\n");
        return 1;
    }
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
        FREE(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);
        if (pAdapterInfo == NULL) {
            printf("Error allocating memory needed to call GetAdaptersinfo\n");
            return 1;
        }
    }

    if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
        pAdapter = pAdapterInfo;
        while (pAdapter) {
            printf("\tComboIndex: \t%d\n", pAdapter->ComboIndex);
            printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);
            printf("\tAdapter Desc: \t%s\n", pAdapter->Description);
            printf("\tAdapter Addr: \t");
            for (i = 0; i < pAdapter->AddressLength; i++) {
                if (i == (pAdapter->AddressLength - 1))
                    printf("%.2X\n", (int) pAdapter->Address[i]);
                else
                    printf("%.2X-", (int) pAdapter->Address[i]);
            }
            printf("\tIndex: \t%d\n", pAdapter->Index);
            printf("\tType: \t");
            switch (pAdapter->Type) {
            case MIB_IF_TYPE_OTHER:
                printf("Other\n");
                break;
            case MIB_IF_TYPE_ETHERNET:
                printf("Ethernet\n");
                break;
            case MIB_IF_TYPE_TOKENRING:
                printf("Token Ring\n");
                break;
            case MIB_IF_TYPE_FDDI:
                printf("FDDI\n");
                break;
            case MIB_IF_TYPE_PPP:
                printf("PPP\n");
                break;
            case MIB_IF_TYPE_LOOPBACK:
                printf("Lookback\n");
                break;
            case MIB_IF_TYPE_SLIP:
                printf("Slip\n");
                break;
            default:
                printf("Unknown type %ld\n", pAdapter->Type);
                break;
            }

            printf("\tIP Address: \t%s\n",
                   pAdapter->IpAddressList.IpAddress.String);
            printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);

            printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
            printf("\t***\n");

            if (pAdapter->DhcpEnabled) {
                printf("\tDHCP Enabled: Yes\n");
                printf("\t  DHCP Server: \t%s\n",
                       pAdapter->DhcpServer.IpAddress.String);

                printf("\t  Lease Obtained: ");
                /* Display local time */
                error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseObtained);
                if (error)
                    printf("Invalid Argument to _localtime32_s\n");
                else {
                    // Convert to an ASCII representation 
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_s\n");
                    else
                        /* asctime_s returns the string terminated by \n\0 */
                        printf("%s", buffer);
                }

                printf("\t  Lease Expires:  ");
                error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseExpires);
                if (error)
                    printf("Invalid Argument to _localtime32_s\n");
                else {
                    // Convert to an ASCII representation 
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_s\n");
                    else
                        /* asctime_s returns the string terminated by \n\0 */
                        printf("%s", buffer);
                }
            } else
                printf("\tDHCP Enabled: No\n");

            if (pAdapter->HaveWins) {
                printf("\tHave Wins: Yes\n");
                printf("\t  Primary Wins Server:    %s\n",
                       pAdapter->PrimaryWinsServer.IpAddress.String);
                printf("\t  Secondary Wins Server:  %s\n",
                       pAdapter->SecondaryWinsServer.IpAddress.String);
            } else
                printf("\tHave Wins: No\n");
            pAdapter = pAdapter->Next;
            printf("\n");
        }
    } else {
        printf("GetAdaptersInfo failed with error: %d\n", dwRetVal);

    }
    if (pAdapterInfo)
        FREE(pAdapterInfo);

    return 0;
}

需求

   
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
標頭 iptypes.h (包含 Iphlpapi.h)

另請參閱

GetAdaptersAddresses

GetAdaptersInfo

IP 協助程式起始頁

IP 協助程式結構

IP_ADAPTER_ADDRESSES

IP_ADDRESS_STRING

IP_ADDR_STRING