方法一:(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 ", 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 ", 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 ", lenum.lana, uRetCode ); if ( uRetCode == 0 ) { printf( "The Ethernet Number on LANA %d is:%02x%02x%02x%02x%02x%02x ", 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 "); printf(" getadapteraddresses 4 (for IPv4) "); printf(" getadapteraddresses 6 (for IPv6) "); printf(" getadapteraddresses A (for both IPv4 and IPv6) "); 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 "); if (family == AF_INET6) printf("AF_INET6 "); if (family == AF_UNSPEC) printf("AF_UNSPEC "); // 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 "); 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(" Length of the IP_ADAPTER_ADDRESS struct: %ld ", pCurrAddresses->Length); printf(" IfIndex (IPv4 interface): %u ", pCurrAddresses->IfIndex); printf(" Adapter name: %s ", pCurrAddresses->AdapterName); pUnicast = pCurrAddresses->FirstUnicastAddress; if (pUnicast != NULL) { for (i = 0; pUnicast != NULL; i++) pUnicast = pUnicast->Next; printf(" Number of Unicast Addresses: %d ", i); } else printf(" No Unicast Addresses "); pAnycast = pCurrAddresses->FirstAnycastAddress; if (pAnycast) { for (i = 0; pAnycast != NULL; i++) pAnycast = pAnycast->Next; printf(" Number of Anycast Addresses: %d ", i); } else printf(" No Anycast Addresses "); pMulticast = pCurrAddresses->FirstMulticastAddress; if (pMulticast) { for (i = 0; pMulticast != NULL; i++) pMulticast = pMulticast->Next; printf(" Number of Multicast Addresses: %d ", i); } else printf(" No Multicast Addresses "); pDnServer = pCurrAddresses->FirstDnsServerAddress; if (pDnServer) { for (i = 0; pDnServer != NULL; i++) pDnServer = pDnServer->Next; printf(" Number of DNS Server Addresses: %d ", i); } else printf(" No DNS Server Addresses "); printf(" DNS Suffix: %wS ", pCurrAddresses->DnsSuffix); printf(" Description: %wS ", pCurrAddresses->Description); printf(" Friendly name: %wS ", pCurrAddresses->FriendlyName); if (pCurrAddresses->PhysicalAddressLength != 0) { printf(" Physical address: "); for (i = 0; i < (int) pCurrAddresses->PhysicalAddressLength; i++) { if (i == (pCurrAddresses->PhysicalAddressLength - 1)) printf("%.2X ", (int) pCurrAddresses->PhysicalAddress[i]); else printf("%.2X-", (int) pCurrAddresses->PhysicalAddress[i]); } } printf(" Flags: %ld ", pCurrAddresses->Flags); printf(" Mtu: %lu ", pCurrAddresses->Mtu); printf(" IfType: %ld ", pCurrAddresses->IfType); printf(" OperStatus: %ld ", pCurrAddresses->OperStatus); printf(" Ipv6IfIndex (IPv6 interface): %u ", pCurrAddresses->Ipv6IfIndex); printf(" ZoneIndices (hex): "); for (i = 0; i < 16; i++) printf("%lx ", pCurrAddresses->ZoneIndices[i]); printf(" "); printf(" Transmit link speed: %I64u ", pCurrAddresses->TransmitLinkSpeed); printf(" Receive link speed: %I64u ", pCurrAddresses->ReceiveLinkSpeed); pPrefix = pCurrAddresses->FirstPrefix; if (pPrefix) { for (i = 0; pPrefix != NULL; i++) pPrefix = pPrefix->Next; printf(" Number of IP Adapter Prefix entries: %d ", i); } else printf(" Number of IP Adapter Prefix entries: 0 "); printf(" "); pCurrAddresses = pCurrAddresses->Next; } } else { printf("Call to GetAdaptersAddresses failed with error: %d ", dwRetVal); if (dwRetVal == ERROR_NO_DATA) printf(" No addresses were found for the requested parameters "); 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(" Error: %s", lpMsgBuf); LocalFree(lpMsgBuf); if (pAddresses) FREE(pAddresses); exit(1); } } } if (pAddresses) { FREE(pAddresses); } return 0; }