获取网卡信息
方法一:(msdn)
#include <tchar.h> #include <windows.h> #include <wincon.h> #include <stdlib.h> #include <stdio.h> #pragma comment(lib,"netapi32.lib") typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; }ASTAT, * PASTAT; ASTAT Adapter; int main(int argc, char* argv[]) { NCB Ncb; UCHAR uRetCode; LANA_ENUM lenum; int i; memset( &Ncb, 0, sizeof(Ncb) ); Ncb.ncb_command = NCBENUM; Ncb.ncb_buffer = (UCHAR *)&lenum; Ncb.ncb_length = sizeof(lenum); uRetCode = Netbios( &Ncb ); printf( "The NCBENUM return code is: 0x%x \n", uRetCode ); for(i=0; i < lenum.length ;i++) { memset( &Ncb, 0, sizeof(Ncb) ); Ncb.ncb_command = NCBRESET; Ncb.ncb_lana_num = lenum.lana[i]; uRetCode = Netbios( &Ncb ); printf( "The NCBRESET on LANA %d return code is: 0x%x \n", lenum.lana, uRetCode ); memset( &Ncb, 0, sizeof (Ncb) ); Ncb.ncb_command = NCBASTAT; Ncb.ncb_lana_num = lenum.lana[i]; strcpy( (char *)Ncb.ncb_callname, "* " ); Ncb.ncb_buffer = (unsigned char *) &Adapter; Ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios( &Ncb ); printf( "The NCBASTAT on LANA %d return code is: 0x%x \n", lenum.lana, uRetCode ); if ( uRetCode == 0 ) { printf( "The Ethernet Number on LANA %d is:%02x%02x%02x%02x%02x%02x\n", lenum.lana, Adapter.adapt.adapter_address[0], Adapter.adapt.adapter_address[1], Adapter.adapt.adapter_address[2], Adapter.adapt.adapter_address[3], Adapter.adapt.adapter_address[4], Adapter.adapt.adapter_address[5] ); } } system("pause"); return 0; }
方法二:(msdn)
#include <winsock2.h> #include <iphlpapi.h> #include <stdio.h> #include <stdlib.h> // Link with Iphlpapi.lib #pragma comment(lib, "IPHLPAPI.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; // 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; 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("\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; pAnycast != 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"); 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; }