[C++] 纯文本查看 复制代码
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <ws2tcpip.h>
// Link with Iphlpapi.lib
#pragma comment(lib, "IPHLPAPI.lib")
#pragma comment(lib, "Ws2_32.lib")
#define WORKING_BUFFER_SIZE 15000
#define MAX_TRIES 3
#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 | GAA_FLAG_INCLUDE_GATEWAYS;
// default to unspecified address family (both)
ULONG family = AF_UNSPEC;
LPVOID lpMsgBuf = NULL;
PIP_ADAPTER_ADDRESSES pAddresses = NULL;
ULONG outBufLen = 0;
ULONG Iterations = 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;
const DWORD Size = 512;
DWORD bufflen = Size;
char buff[Size];
char IP[130] ={0};
char getway[130] = { 0 };
char dhcpv6[130] = { 0 };
char dhcpv4[130] = { 0 };
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;
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");
// Allocate a 15 KB buffer to start with.
outBufLen = WORKING_BUFFER_SIZE;
do {
pAddresses = (IP_ADAPTER_ADDRESSES*)MALLOC(outBufLen);
if (pAddresses == NULL) {
printf
("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
exit(1);
}
dwRetVal =
GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);
if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
FREE(pAddresses);
pAddresses = NULL;
}
else {
break;
}
Iterations++;
} while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations < MAX_TRIES));
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("\t[%s]\n", pCurrAddresses->AdapterName);
//printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);
pUnicast = pCurrAddresses->FirstUnicastAddress;
if (pUnicast != NULL) {
int i = 0;
while (pUnicast) {
i++;
if (AF_INET == pUnicast->Address.lpSockaddr->sa_family) // IPV4 地址,使用 IPV4 转换
{
inet_ntop(PF_INET, &((sockaddr_in*)pUnicast->Address.lpSockaddr)->sin_addr, IP, sizeof(IP));
printf("\tUnicast Addresses[%d]= %s\n",i ,IP);
}
else if (AF_INET6 == pUnicast->Address.lpSockaddr->sa_family) // IPV6 地址,使用 IPV6 转换
{
inet_ntop(PF_INET6, &((sockaddr_in6*)pUnicast->Address.lpSockaddr)->sin6_addr, IP, sizeof(IP));
printf("\tUnicast Addresses[%d]= %s\n",i, IP);
}
pUnicast = pUnicast->Next;
}
printf("\tNumber of Unicast Addresses= %d\n", i);
}
else
printf("\tNo Unicast 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 != NULL) {
int i = 0;
while (pDnServer) {
i++;
if (AF_INET == pDnServer->Address.lpSockaddr->sa_family) // IPV4 地址,使用 IPV4 转换
{
inet_ntop(PF_INET, &((sockaddr_in*)pDnServer->Address.lpSockaddr)->sin_addr, IP, sizeof(IP));
printf("\tDNS Server Addresses[%d]= %s\n", i, IP);
}
else if (AF_INET6 == pDnServer->Address.lpSockaddr->sa_family) // IPV6 地址,使用 IPV6 转换
{
inet_ntop(PF_INET6, &((sockaddr_in6*)pDnServer->Address.lpSockaddr)->sin6_addr, IP, sizeof(IP));
printf("\tDNS Server Addresses[%d]= %s\n", i, IP);
}
pDnServer = pDnServer->Next;
}
printf("\tNumber of DNS Server Addresses= %d\n", i);
}
else
printf("\tNo DNS Server Addresses\n");
auto pGetway = pCurrAddresses->FirstGatewayAddress;
while (pGetway) //网关
{
if (AF_INET == pGetway->Address.lpSockaddr->sa_family)
inet_ntop(PF_INET, &((sockaddr_in*)pGetway->Address.lpSockaddr)->sin_addr, getway, sizeof(getway));
else if (AF_INET6 == pGetway->Address.lpSockaddr->sa_family)
inet_ntop(PF_INET6, &((sockaddr_in6*)pGetway->Address.lpSockaddr)->sin6_addr, getway, sizeof(getway));
pGetway = pGetway->Next;
}
printf("\tGateway Addresses= %s\n", getway);
//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);
else
printf("%.2X-",
(int)pCurrAddresses->PhysicalAddress);
}
}
//printf("\tFlags: %ld\n", pCurrAddresses->Flags);
printf("\tMtu: %lu\n", pCurrAddresses->Mtu);
//接口类型
switch(pCurrAddresses->IfType)
{
case MIB_IF_TYPE_ETHERNET:printf("\tIfType: %s\n", "以太网接口"); break;
case MIB_IF_TYPE_PPP:printf("\tIfType: %s\n", "PPP接口"); break;
case MIB_IF_TYPE_LOOPBACK:printf("\tIfType: %s\n", "软件环回接口"); break;
case IF_TYPE_IEEE80211:printf("\tIfType: %s\n", "无线网络接口"); break;
}
printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus);
// printf("\tIpv6IfIndex (IPv6 interface): %u\n",
// pCurrAddresses->Ipv6IfIndex);
if (pCurrAddresses->Dhcpv6Server.lpSockaddr)//IPV6DHCP
{
if (AF_INET6 == pCurrAddresses->Dhcpv6Server.lpSockaddr->sa_family)
{
inet_ntop(PF_INET6, &((sockaddr_in6*)pCurrAddresses->Dhcpv6Server.lpSockaddr)->sin6_addr, dhcpv6, sizeof(dhcpv6));
}
}
printf("\tDhcp IPv4 Enable= %lu\n", pCurrAddresses->Dhcpv4Enabled);
printf("\tIPv6 Enable= %lu\n", pCurrAddresses->Ipv6Enabled);
printf("\tIPv4 Enable= %lu\n", pCurrAddresses->Ipv4Enabled);
printf("\tTransmit link speed= %I64u\n", pCurrAddresses->TransmitLinkSpeed);
printf("\tReceive link speed= %I64u\n", pCurrAddresses->ReceiveLinkSpeed);
//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("\tNumber of IP Adapter Prefix entries: 0\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);
if (pAddresses)
FREE(pAddresses);
exit(1);
}
}
}
if (pAddresses) {
FREE(pAddresses);
}
return 0;
}