【问题标题】:How to get the vendor OUI and Device name from MAC Address in C/C++如何从 C/C++ 中的 MAC 地址获取供应商 OUI 和设备名称
【发布时间】:2021-08-19 09:47:40
【问题描述】:

我正在借助 libtins 库在 C++ 中开发网络扫描仪,我可以获取 MAC 地址和 IP,但我想进一步了解供应商(例如:英特尔公司)和设备名称(例如: C++ 中的 DESKTOP-TO5P0BD)


获取 Mac 和 IP 的代码

// 获取 ARP 层信息

const ARP& arp = pdu.rfind_pdu<ARP>();
std::cout << "Found :" << arp.sender_ip_addr() << ", " << arp.sender_hw_addr() << std::endl;
// Checking if it is an ARP reply?
if (arp.opcode() == ARP::REPLY) {
    // Let's check if there's already an entry for this address
auto iter = addresses.find(arp.sender_ip_addr());
if (iter == addresses.end()) {
    std::cout << "saving " << arp.sender_ip_addr() << ", " << arp.sender_hw_addr() << std::endl;
    // We haven't seen this address. Save it.
    addresses.insert({ arp.sender_ip_addr(), arp.sender_hw_addr() });
    IPv4Address ip = arp.sender_ip_addr();
    NetworkInterface iface(ip);
    //std::cout << iface.name() << std::endl;
}
else {
    std::cout << "already seen " << arp.sender_ip_addr() << ", " << arp.sender_hw_addr() << std::endl;
    // We've seen this address. If it's not the same HW address, inform it
    if (arp.sender_hw_addr() != iter->second) {
        std::cout << "[WARNING] " << arp.sender_ip_addr() << " is at "
            << iter->second << " but also at " << arp.sender_hw_addr()
            << std::endl;
    }
}
}

【问题讨论】:

    标签: c++ c networking


    【解决方案1】:

    为了从 MAC 地址获取供应商,您可以查看由 Wireshark 管理的this MAC OUI vendor database。这是一个格式简单的文本文件。

    为了获得“设备名称”,您可以进行NetBIOS 名称查找。 This StackOverflow question 可以帮到你。

    【讨论】:

    • 问题是,不通过MAC厂商的数据库就不能完成MAC厂商的问题吗?如果否,没问题我可以去找你的答案但设备名称的问题仍然没有回答,请帮助
    • Wireshark 数据库很容易用 C/C++ 解析,它是 MAC 供应商最好的数据库之一(并且它得到了积极维护),所以我认为您的程序获取此数据库中的 MAC 供应商。关于获取设备名称,您可以使用 UDP 进行 NetBIOS 名称查找(这适用于大多数 Windows 计算机)。然而,最快的解决方案可能是从您的程序中执行一个命令行实用程序(在 Windows 上,您有 nbtstat)并解析命令的标准输出。
    【解决方案2】:

    如果您想从 MAC 中获取供应商名称,您可以通过读取 arp -a (probably via the winapi) 来获取 MAC。接下来你需要搜索一个供应商数据库,wireshark list 很好,还有this one。至于“设备名称”,您可以使用 WMI 进行检查。除了more complex winapi for this,您还可以使用像this one 这样的库,它要简单得多。您需要向 Win32_ComputerSystem 类发出请求,其中包含设备名称和型号等。 MAC 地址也可以通过 WMI 检索,而是对 Win32_NetworkAdapter 进行查询 - 它提供了所有接口,因此请务必找到正确的接口!

    【讨论】:

    • 优秀的答案,我设法将供应商数据库作为 JSON 并循环到它,但我仍然无法获得设备名称(我所做的所有研究,我已经看到我必须去到第 7 层但我只想操作数据报和数据帧(第 2 层和第 3 层)
    猜你喜欢
    • 2021-06-05
    • 1970-01-01
    • 2011-11-27
    • 2020-09-02
    • 2015-12-26
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多