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 和更新版本可能會有其他值。
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 位平臺上 LeaseObtained 和 LeaseExpires 成員所使用的 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) |