C/C++通过IP地址获取局域网网卡MAC地址的实现方法

木瞳 2025-02-07 16:00:39编程技术
521

在现代计算机网络中,IP地址和MAC地址是网络通信中不可或缺的两个关键元素。IP地址作为网络层协议地址,负责在广域的网络环境中定位设备;而MAC地址则作为数据链路层地址,在局域网内实现设备之间的直接通信。在某些应用场景下,我们可能需要通过已知的IP地址来获取对应设备的MAC地址,比如在网络安全监控、设备管理和网络故障排查中,这一功能尤为重要。本文将详细介绍如何在C/C++环境下,通过编程实现这一功能,利用Windows平台提供的网络编程接口(Windows Sockets API 和 IP Helper API),解析并获取指定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地址。我们利用Windows平台的Windows Sockets API和IP Helper API,通过一系列函数调用,成功地实现了从IP地址到MAC地址的映射查询。这一过程中,我们不仅学习了WSA的初始化与清理,还掌握了如何使用IP Helper API中的关键函数来查询网络接口信息。同时,程序中的错误处理机制也确保了程序的健壮性和可靠性。此实现方法不仅为网络管理和监控提供了有力工具,也为进一步探索网络编程和网络安全领域奠定了坚实基础。通过这一实践,我们深刻体会到理论与实践相结合的重要性,以及在网络技术日新月异发展的今天,持续学习和探索新技术、新方法的必要性。

C++ IP地址 MAC地址
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

c++中sprintf函数使用方法及示例代码详解
作为C标准库中的经典函数,sprintf通过格式字符串将数据转换为指定格式的字符串,尤其适合处理需要将数值、字符等混合输出的场景。本文ZHANID工具网将系统讲解sprintf的函数原...
2025-08-08 编程技术
432

如何查看自己的IP地址?本地IP与公网IP的区别解析
在数字化时代,IP地址作为网络通信的"门牌号",是连接设备与互联网的核心标识。无论是设置路由器、远程办公还是网络安全防护,掌握IP地址的查看方法及理解本地IP与公网IP的差...
2025-07-07 电脑知识
627

默认网关地址是多少?默认网关IP地址怎么填?
在计算机网络中,默认网关是连接本地网络与外部网络的关键节点,如同现实世界中的“交通枢纽”,所有离开本地网络的数据包均需通过默认网关完成路由转发。本文ZHANID工具网将...
2025-07-02 电脑知识
1989

基于Python开发电脑ip地址查询工具示例代码详解
在网络安全、网络调试和系统管理场景中,快速获取本机IP地址信息是高频需求。本文将ZHANID工具网通过Python实现一个跨平台的IP查询工具,支持获取本地网络IP、公网IP及地理位...
2025-05-20 编程技术
568

C++ 中 format 和 vformat 函数的使用示例与详细解析
在C++编程中,字符串格式化是一项常见且重要的操作。C++11虽然引入了新的C风格字符串格式化函数,但类型安全问题依旧存在。直到C++20标准的发布,引入了format和vformat函数,...
2025-02-17 编程技术
581

Visual Studio Code(VSCode)中配置 C++ 开发环境的详细教程
随着编程语言和开发工具的不断更新,选择一款高效、易用的开发环境变得尤为重要。Visual Studio Code(简称VSCode)作为一款轻量级但功能强大的代码编辑器,受到了广大开发者的...
2025-01-06 编程技术
498