GetIPAddress——获得本地IP地址信息
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; }