C/C++通过IP获取局域网网卡MAC地址
作者:木瞳
这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下
C/C++通过IP获取局域网网卡MAC地址
通过win32 SendARP获取MAC地址
代码
#include <winsock2.h>
#include <iostream>
#include<iphlpapi.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"iphlpapi.lib")
/**
* 通过局域网ip获取网卡MAC地址
*/
std::string GetMacAddress(std::string destIpStr)
{
IPAddr srcIp = 0;
IPAddr destIp = 0;
ULONG mac[2];
ULONG macLen = 6;
destIp = inet_addr(destIpStr.c_str());
memset(mac,0xff,sizeof(mac));
SendARP(destIp,srcIp,(PVOID)mac,(PULONG)&macLen);
printf("%p\r\n",mac);
// 打印mac
byte* bMac = (byte*)mac;
std::string macResult;
for (size_t i = 0; i < macLen; i++)
{
char macItem[2];
/* code */
sprintf(macItem,"%.2X",bMac[i]);
macResult.append(macItem);
if(i<macLen-1)
{
macResult.append("-");
}
}
return macResult;
};调用
void main(int* argc,char* argv[])
{
// std::cout << 1111 <<std::endl;
std::string ip;
ip.append("192.168.31.191");
std::string mac = GetMacAddress(ip);
std::cout <<"ip\tmac"<< std::endl;
std::cout << ip.c_str() << "\t" <<mac.c_str() << std::endl;
getchar();
};输出
ip mac
192.168.31.191 08-D1-27-8F-25-EV
方法补充
除了上文的方法,小编还为大家整理了C++ 通过IP地址获取MAC地址的其他方法,希望对大家有所帮助
话不多说 直接上代码
#include <iostream>
#include <string>
#include <winsock2.h>
#include <iphlpapi.h>
#pragma warning(disable:4996)
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")
std::string getMacAddress(const std::string& ipAddress) {
// 初始化Winsock
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed." << std::endl;
return "";
}
// 将IP地址转换为ULONG格式
ULONG destIp = inet_addr(ipAddress.c_str());
if (destIp == INADDR_NONE) {
std::cerr << "Invalid IP address." << std::endl;
WSACleanup();
return "";
}
// 准备接收MAC地址的缓冲区
ULONG macAddr[2];
ULONG macAddrLen = 6;
memset(macAddr, 0xff, sizeof(macAddr));
// 调用SendARP函数获取MAC地址
DWORD ret = SendARP(destIp, 0, macAddr, &macAddrLen);
if (ret == NO_ERROR) {
// 将MAC地址转换为字符串格式
BYTE* macBytes = (BYTE*)macAddr;
char macStr[18];
sprintf_s(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
macBytes[0], macBytes[1], macBytes[2],
macBytes[3], macBytes[4], macBytes[5]);
WSACleanup();
return std::string(macStr);
}
else {
std::cerr << "Failed to get MAC address. Error code: " << ret << std::endl;
WSACleanup();
return "";
}
}
int main() {
std::string ipAddress;
std::cout << "Enter IP address: ";
std::cin >> ipAddress;
std::string macAddress = getMacAddress(ipAddress);
if (!macAddress.empty()) {
std::cout << "MAC Address: " << macAddress << std::endl;
}
else {
std::cout << "Could not retrieve MAC address." << std::endl;
}
return 0;
}
到此这篇关于C/C++通过IP获取局域网网卡MAC地址的文章就介绍到这了,更多相关C++获取局域网MAC地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
