GetAdaptersAddresses无法获取网关信息?

amos402 2012-05-05 11:20:09
调用GetAdaptersAddresses后的ip mac dns这些都能正常获取,但是
PIP_ADAPTER_ADDRESSES m_pCurrAddresses->FirstUnicastAddress->Address.lpSockaddr

里面是空的。

顺便问下,PIP_ADAPTER_ADDRESSES里包含子网掩码信息吗,找了半天都找不到
...全文
497 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Huer 2013-11-09
  • 打赏
  • 举报
回复
为什么我在xp下用vc6.0编译的时候,出现连接错误,说找不到外部引用的GetAdaptersAddresses。。。。。请求帮忙
amos402 2012-05-10
  • 打赏
  • 举报
回复
- =查mask地址是不是只能GetAdapterInfo了
amos402 2012-05-07
  • 打赏
  • 举报
回复
- =太长没细心看,我之前还以为0是包含全部呢
但貌似还是找不到mask地址
amos402 2012-05-06
  • 打赏
  • 举报
回复
用GetAdaptersInfo可以正常获取网关,但是为什么GetAdaptersAddresses得到的是空。。。
Eleven 2012-05-06
  • 打赏
  • 举报
回复
看一下第二个参数Flags的说明

Flags
The type of addresses to retrieve. The possible values are defined in the Iptypes.h header file. Note that the Iptypes.h header file is automatically included in Iphlpapi.h, and should never be used directly.

This parameter is a combination of the following values. If this parameter is zero, then unicast, anycast, and multicast IP addresses will be returned.

Value Meaning
GAA_FLAG_INCLUDE_ALL_COMPARTMENTS
Return addresses in all routing compartments. This flag is not currently supported and reserved for future use.

GAA_FLAG_INCLUDE_ALL_INTERFACES
Return addresses for all NDIS interfaces. This flag is supported on Windows Vista and later.

//这里
GAA_FLAG_INCLUDE_GATEWAYS
Return the addresses of default gateways. This flag is supported on Windows Vista and later.

GAA_FLAG_INCLUDE_PREFIX
Return a list of IP address prefixes on this adapter. This flag is supported on Windows XP SP1 and later.

GAA_FLAG_INCLUDE_TUNNEL_BINDINGORDER
Return the adapter addresses sorted in tunnel binding order. This flag is supported on Windows Vista and later.

GAA_FLAG_INCLUDE_WINS_INFO
Return addresses of WINS servers. This flag is supported on Windows Vista and later.

GAA_FLAG_SKIP_ANYCAST
Do not return IPv6 anycast addresses.

GAA_FLAG_SKIP_DNS_SERVER
Do not return addresses of DNS servers.

GAA_FLAG_SKIP_FRIENDLY_NAME
Do not return the adapter friendly name.

GAA_FLAG_SKIP_MULTICAST
Do not return multicast addresses.

GAA_FLAG_SKIP_UNICAST
Do not return unicast addresses.

amos402 2012-05-05
  • 打赏
  • 举报
回复
msdn那个我看过,他没有打印gateway地址- =
Eleven 2012-05-05
  • 打赏
  • 举报
回复
MSDN上的例子代码

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdlib.h>

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

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 GetAdapters Addresses 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; pUnicast != 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 < (int) 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;
}
amos402 2012-05-05
  • 打赏
  • 举报
回复
网关信息呢,得到的结构体的FirstGatewayAddress怎么都是空的。。。
fishion 2012-05-05
  • 打赏
  • 举报
回复
查了下,好像是GetAdapterInfo才有得查子网掩码

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧