0

我在 Windows 7 上使用 Qt5。
在我的应用程序(TCP 服务器)中,我目前正在使用 QTcpSocket 类中的一些方法:
-QAbstractSocket::peerAddress()为了获取对等地址
-QAbstractSocket::peerPort()为了获得对等端口

我还想获取通信对等方的MAC 地址
这是否可能,无需使用自定义协议(即无需在我的应用程序和对等方之间交换一些自定义消息)?如果是,如何?

后期编辑:现在有一个非常好的解决方案- 我几个月前实施了。与此同时,我对其进行了测试,它可以 100% 完美运行。享受 :)

4

3 回答 3

2

这是获取通信对等方的 MAC 地址的代码。
在后台,它使用 Windows 命令arp
使用 Qt5.8,在 Windows 7 上测试:

QString getMacForIP(QString ipAddress)
{
    QString MAC;
    QProcess process;
    //
    process.start(QString("arp -a %1").arg(ipAddress));
    if(process.waitForFinished())
    {
        QString result = process.readAll();
        QStringList list = result.split(QRegularExpression("\\s+"));
        if(list.contains(ipAddress))
            MAC = list.at(list.indexOf(ipAddress) + 1);
    }
    //
    return MAC;
}

备注:远程对等体必须在同一个局域网上。
另一句话:如果 IP 地址不存在,您将获得 MAC 的空字符串。

于 2018-10-15T10:18:23.423 回答
1

一般来说,不,这是不可能的,因为通信对等方甚至可能没有 MAC 地址(例如,如果它使用不基于以太网的网络硬件)。特别是,有关 MAC 地址的信息不通过 IP、TCP 或 UDP 层进行通信——这些层使用 IP 地址代替。因此,如果您想找出对等方的 MAC 地址,您需要在应用程序级别执行此操作,方法是让对等方上的程序将其发送给您。

(上述的一个小例外:如果您通过 IPv6 进行通信并使用自分配的链路本地 IPv6 地址(例如 fe80::blah),则可以从其自分配的 IPv6 地址派生计算机的 MAC 地址,因为自分配 IPv6 地址通常来自 MAC 地址,并将 MAC 地址作为其 IPv6 地址的子集。[请注意,这在 Internet 上不起作用,因为链路本地地址仅在两台计算机都位于同一个局域网])

如果远程对等点与程序的主机位于同一 LAN(并且 LAN 是以太网 LAN),则程序可能正在使用某些 Windows 特定的 API 来查找机器 ARP 表中的 IPAddress<->MACAddress 映射。如果远程对等点在 Internet 上的其他地方,那么我不知道它是如何做到的。

于 2016-02-07T00:42:05.427 回答
0

如果您可以在远程对等点上运行代码,则可以通过接口的hardwareAddress()调用报告 MAC 地址。

例如,要报告 WiFi 接口的 MAC 地址,以及该接口上的所有 IPv4 地址:

for(const QNetworkInterface& iface: QNetworkInterface::allInterfaces()){
    if (iface.type() == QNetworkInterface::Wifi){
        qDebug() << "MAC:" << iface.hardwareAddress();
        for (const QHostAddress& addr : iface.allAddresses()){
            if (addr.protocol() == QAbstractSocket::IPv4Protocol)
                qDebug() << "IPv4 Addr: " << addr;
        }
    }
}
于 2020-04-30T22:31:51.573 回答