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
类型: struct _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 服务器,或者正在达到 DHCP 服务器。
仅当 DhcpEnabled 成员为非零时,此成员才有效。
HaveWins
类型: BOOL
一个选项值,指定此适配器是否使用 Windows Internet 名称服务 (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) |