获取IP/MAC地址方法

来源:互联网 发布:mac 蓝光播放器 编辑:程序博客网 时间:2024/05/22 16:39

1. 获取主机名称

//得到计算机名称//或者通过gethostname()获取CString GetMyComputerName(){DWORD dwSize = INTERNET_MAX_HOST_NAME_LENGTH;char szHostName[INTERNET_MAX_HOST_NAME_LENGTH];memset(szHostName, 0, INTERNET_MAX_HOST_NAME_LENGTH);GetComputerName(szHostName, &dwSize);return szHostName;}


2. 获取本机IP地址

//得到本机IP地址BOOL GetLocalIpAddr(char* szIP, int nLen){//初始化SocketWSADATA wsaData;WORD wVerReq = MAKEWORD(2, 2);int nRet = WSAStartup(wVerReq, &wsaData);if (0 != nRet){return FALSE;}//校验Socket版本            if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {return FALSE;}//获取主机名称char szHost[INTERNET_MAX_HOST_NAME_LENGTH] = { 0 };nRet = gethostname(szHost, INTERNET_MAX_HOST_NAME_LENGTH - 1);if (SOCKET_ERROR == nRet){return FALSE;}//获取本机地址PHOSTENT  pHostInfo = gethostbyname(szHost);if (NULL == pHostInfo || NULL == pHostInfo->h_addr_list[0]){return FALSE;}//获取IP地址strcpy_s(szIP, nLen - 1, inet_ntoa(*(struct in_addr *)pHostInfo->h_addr_list[0]));return TRUE;}


3. 获取本机MAC地址

//得到本机MAC地址BOOL GetLocalMacAddr(char *szMac, int nMacLen){//获取IPchar szIP[MAX_PATH] = { 0 };GetLocalIpAddr(szIP, MAX_PATH);//获取MACreturn  GetMacAddrByIp(szIP, szMac, nMacLen);}


4. 根据IP获取MAC地址(可获取远程主机MAC地址)

//根据IP获取MAC地址(可获取远程主机MAC地址)BOOL GetMacAddrByIp(const char *szIPAddr, char *szMacAddr, int nMacLen){IPAddr ipAddr = inet_addr(szIPAddr);ULONG szMac[2] = {0};ULONG ulLen = 6;HRESULT hr = SendARP(ipAddr, 0, szMac, &ulLen);if (hr != NO_ERROR){return FALSE;}unsigned char * mac_addr = (unsigned char*)szMac;sprintf_s(szMacAddr, nMacLen, "%02X-%02X-%02X-%02X-%02X-%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);return TRUE;}


5.获取网卡详细信息

//获取网卡详细信息typedef struct tag_strAdpterInfo{string sAdpterName;string sAdpterDesc;string sMacAddr;string sIPAddr;string sIpMask;string sGateway;}strAdpterInfo_S;#include "Iphlpapi.h" #pragma comment(lib, "Iphlpapi.lib") 


//获取本机网卡详细信息BOOL GetAdapterInfo(vector<strAdpterInfo_S> &vecAdpterInfo){// 初始化winsockPIP_ADAPTER_INFO pAdapterInfo;PIP_ADAPTER_INFO pAdapter = NULL;ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulOutBufLen);// 第一次调用GetAdapterInfo获取ulOutBufLen的具体大小DWORD dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);if (dwRetVal == ERROR_BUFFER_OVERFLOW){free(pAdapterInfo);pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);}if (dwRetVal == NO_ERROR){pAdapter = pAdapterInfo;vecAdpterInfo.clear();while (pAdapter){strAdpterInfo_S strAdpter;strAdpter.sAdpterName = pAdapter->AdapterName;strAdpter.sAdpterDesc = pAdapter->Description;char szMac[20] = { 0 };sprintf_s(szMac, "%02x-%02x-%02x-%02x-%02x-%02x\n",pAdapter->Address[0],pAdapter->Address[1],pAdapter->Address[2],pAdapter->Address[3],pAdapter->Address[4],pAdapter->Address[5]);strAdpter.sMacAddr = szMac;strAdpter.sIPAddr = pAdapter->IpAddressList.IpAddress.String;strAdpter.sIpMask = pAdapter->IpAddressList.IpMask.String;strAdpter.sGateway = pAdapter->GatewayList.IpAddress.String;vecAdpterInfo.push_back(strAdpter);pAdapter = pAdapter->Next;}}if (pAdapterInfo){free(pAdapterInfo);}return TRUE;}


6. 获取本机MAC地址,相对复杂的做法

//得到本机MAC地址,相对复杂//参考: http://blog.csdn.net/neicole/article/details/7587414//使用结构NCB和函数Netbios()需要加载:#include <Nb30.h>#pragma comment(lib, "netapi32.lib")  //定义两个存放返回网卡信息的变量typedef struct _ASTAT_{ADAPTER_STATUS adapt;//网络适配器状态NAME_BUFFER    NameBuff[30];//名字表信息}ASTAT, *PASTAT;CString GetMacAddress(){//NCB结构,用于设置执行的NetBIOS命令和参数NCB ncb;memset(&ncb, 0, sizeof(ncb));//初始化ncb结构体ncb.ncb_command = NCBRESET;//设置执行NCBRESET,复位网络适配器ncb.ncb_lana_num = 0;//指定网卡序号//首先对选定的网卡发送一个NCBRESET命令,以便进行初始化UCHAR uRetCode = Netbios(&ncb);//执行Netbios()的返回值//printf("The NCBRESET return code is: 0x%x \n", uRetCode);//重新初始化ncbmemset(&ncb, 0, sizeof(ncb));ncb.ncb_command = NCBASTAT;//执行NCBASTAT命令,获取网络适配器状态ncb.ncb_lana_num = 0; //指定网卡序号//设置执行NCBASTAT命令的参数,将获取到的网络适配器数据保存到Adapter结构体中strcpy_s((char *)ncb.ncb_callname, sizeof(ncb.ncb_callname), "*");//指定返回的信息存放的变量 ASTAT Adapter;ncb.ncb_buffer = (unsigned char *)&Adapter;ncb.ncb_length = sizeof(Adapter);//发送NCBASTAT命令以获取网卡的信息 uRetCode = Netbios(&ncb);//printf("The NCBASTAT return code is: 0x%x \n", uRetCode);CString strMacAddr;if (uRetCode == 0){//把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802 strMacAddr.Format("%02X-%02X-%02X-%02X-%02X-%02X\n",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]);return strMacAddr;}return "";}



0 0