QT Windows 实现调用Windows API获取ARP 表

简介

使用ping方式获取网络可访问或者存在的设备发现部分会无法ping通但实际网络上存在此设备, 但使用arp -a却可以显示出来, 所以现在使用windows API的方式获取arp 表。

实现

参考Windows提供的示例转化成Qt

Qt .pro

cpp 复制代码
LIBS += -liphlpapi
    LIBS += -lws2_32

main.cpp

cpp 复制代码
#include <QCoreApplication>
#include <QDebug>
#include <winsock2.h>
#include <windows.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <netioapi.h>

int main()
{
    PMIB_IPNET_TABLE2 pIpNetTable2 = NULL;
    DWORD dwSize = 0;
    unsigned long status = 0;

    // 获取ARP表
    status = GetIpNetTable2(AF_INET, &pIpNetTable2);
    if (status != NO_ERROR)
    {
        printf("GetIpNetTable2 failed (error code %lu)\n", status);
        free(pIpNetTable2);
        return 1;
    }

    // 遍历ARP表并打印每项
    for (DWORD i = 0; i < pIpNetTable2->NumEntries; i++)
    {
        MIB_IPNET_ROW2 row = pIpNetTable2->Table[i];
        QString ip = QString::fromStdString(inet_ntoa(row.Address.Ipv4.sin_addr));
        QString mac = QString::asprintf("%02X-%02X-%02X-%02X-%02X-%02X",
                                                             row.PhysicalAddress[0], row.PhysicalAddress[1],
                                                             row.PhysicalAddress[2], row.PhysicalAddress[3],
                                                             row.PhysicalAddress[4], row.PhysicalAddress[5]);
        if (ip.startsWith("192.168.3") && mac != QString("00-00-00-00-00-00") && row.State != NlnsUnreachable) // 过滤192.168.3网段, mac地址不能为零, 可到达
        {
            qDebug() << "IP: " << ip << ", mac: " << mac;
        }
    }

    // 释放缓冲区
    free(pIpNetTable2);

    return 0;
}

显示

参考

getIpNetTable2 函数 (netioapi.h)

相关推荐
doll ~CJ1 小时前
可视化工具箱-Visualization Toolkit(VTK)
qt·vtk_9.1.0·release_x64
霍霍哈嗨2 小时前
【QT基础】创建项目&项目代码解释
开发语言·qt
sysin.org4 小时前
VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025
windows·macos·esxi·bios·oem·网卡驱动·nvme驱动
Eoneanyna4 小时前
QT设置git仓库
开发语言·git·qt
shuxianshrng4 小时前
大气网格化精细化监管监测系统
大数据·服务器·windows·经验分享
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑5 小时前
苍穹外卖学习笔记(七)
java·windows·笔记·学习·mybatis
偷偷小野猪7 小时前
想要自动删除浏览器历史记录吗?这样设置就对了
windows·edge浏览器
Langneer8 小时前
Qt 状态机编程,双层状态机,实现暂停恢复
开发语言·qt
三玖诶8 小时前
如何在 Qt 的 QListWidget 中为某一行添加点击事件
开发语言·qt
InJre8 小时前
QT widgets 窗口缩放,自适应窗口大小进行布局
开发语言·qt·ui