1.gethostname()需要初始化套接字庫 加載#pragma comment(lib,"ws2_32.lib"),和WSAStartup(MAKEWORD(2,2),&wsaData)函數
2.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; //MAC地址的長度(6字節) BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; //MAC地址 DWORD Index; //適配器索引 UINT Type; //適配器類型 UINT DhcpEnabled; //指定此適配是否有效了DHCP(動態主機配置)協議 PIP_ADDR_STRING CurrentIpAddress; //保留字段 IP_ADDR_STRING IpAddressList; //與此適配器相關的ip列表 IP_ADDR_STRING GatewayList; //網關地址列表 IP_ADDR_STRING DhcpServer; //DHCP服務器 BOOL HaveWins; //指定此適配器是否使用WINS(Windows Internet名稱服務) IP_ADDR_STRING PrimaryWinsServer; //WINS服務器的主IP IP_ADDR_STRING SecondaryWinsServer; //第二IP time_t LeaseObtained; //當前DHCP租用時間 time_t LeaseExpires; //當前DHCP租用期滿的時間 } IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
3.獲取本地機器的適配器信息
GetAdaptersInfo( __out_bcount_opt(*SizePointer) PIP_ADAPTER_INFO AdapterInfo, //指向一個緩沖區用來存放IP_ADAPTER_INFO列表 __inout PULONG SizePointer //指定上方緩沖區的大小,不夠則返回需要的大小 ); //此函數調用成功返回ERROR_SUCCESS
實現代碼
#include "stdafx.h" #include <WinSock2.h> #include <windows.h> #include "Iphlpapi.h" #include <stdio.h> #include <iostream> #pragma comment(lib, "Iphlpapi.lib") #pragma comment(lib, "WS2_32.lib") #pragma comment(lib,"ws2_32.lib") using namespace std; BOOL InitSock(); BOOL GetAllIp(); BOOL GetGlobalData(); // 全局數據 u_char g_ucLocalMac[6]; // 本地MAC地址 DWORD g_dwGatewayIP; // 網關IP地址 DWORD g_dwLocalIP; // 本地IP地址 DWORD g_dwMask; // 子網掩碼 void main() { InitSock(); GetAllIp(); GetGlobalData(); } BOOL InitSock() { WSAData wsaData = {0}; if(WSAStartup(MAKEWORD(2,2),&wsaData)==0) { return TRUE; } return FALSE; } BOOL GetAllIp() { char szHost[256] = {0}; gethostname(szHost,256);//獲取本地主機名 HOSTENT *pHost = gethostbyname(szHost);//通過主機名過得地址信息 if (szHost==NULL) //打印出所有IP地址 { cout<<"error"<<endl; } in_addr addr; for(int i = 0; ;i++) { char *p = pHost->h_addr_list[i]; if(p == NULL) break; memcpy(&addr.S_un.S_addr,p,pHost->h_length); char *szIP = inet_ntoa(addr); cout<<"The LocalAddress:"<<szIP<<endl; } /*char ip[256] = {0}; strcpy(ip,inet_ntoa(*(in_addr*)*pHost->h_addr_list)); cout<<"The LocalAddress:"<<ip<<endl;*/ system("PAUSE"); return TRUE; } BOOL GetGlobalData() { PIP_ADAPTER_INFO pAdapterInfo = NULL; ULONG ulLen = 0; // 為適配器結構申請內存 GetAdaptersInfo(pAdapterInfo,&ulLen); pAdapterInfo = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, ulLen); // 取得本地適配器結構信息 if(::GetAdaptersInfo(pAdapterInfo,&ulLen) == ERROR_SUCCESS) { if(pAdapterInfo != NULL) { for(pAdapterInfo = pAdapterInfo;pAdapterInfo != NULL;pAdapterInfo = pAdapterInfo->Next) { memcpy(g_ucLocalMac, pAdapterInfo->Address, 6); g_dwGatewayIP = ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String); g_dwLocalIP = ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String); g_dwMask = ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String); printf(" \n -------------------- 本地主機信息 -----------------------\n\n"); in_addr in; in.S_un.S_addr = g_dwLocalIP; printf(" IP Address : %s \n", ::inet_ntoa(in)); in.S_un.S_addr = g_dwMask; printf(" Subnet Mask : %s \n", ::inet_ntoa(in)); in.S_un.S_addr = g_dwGatewayIP; printf(" Default Gateway : %s \n", ::inet_ntoa(in)); u_char *p = g_ucLocalMac; printf(" MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]); printf(" \n \n "); pAdapterInfo = pAdapterInfo->Next ; } } } getchar(); return TRUE; }
