Qt / C ++:如何获取远程PC(通信对等体)MAC地址?

时间:2016-02-06 23:08:59

标签: qt sockets tcp mac-address peer

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

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

延迟修改:现在有a very good solution - 几个月前我实施了。我在此期间对它进行了测试,它100%完美无缺。享受:)

3 个答案:

答案 0 :(得分:2)

  

我还想获得通信对等体的MAC地址。是   这可能,不使用自定义协议(即无需使用   在我的应用和同行之间交换一些自定义消息)?如是,   如何?

通常,不,这是不可能的,因为通信对等体甚至可能没有MAC地址(例如,如果它使用的网络硬件不是基于以太网)。特别是,有关MAC地址的信息不会通过IP,TCP或UDP层传递 - 这些层使用IP地址。因此,如果您想查找对等方的MAC地址,您需要在应用程序级别执行此操作,方法是让对等方的程序将其发送给您。

(以上的一个小例外:如果您通过IPv6进行通信并使用自我分配的链路本地IPv6地址(例如fe80 :: blah),则可以从derive Classless Inter-Domain Routing计算机的MAC地址自我分配的IPv6地址,因为自分配的IPv6地址通常来自MAC地址,并包含MAC地址作为其IPv6地址的子集。[注意这不会在Internet上工作,因为链接本地地址只是两台机器位于同一局域网时很有用])

答案 1 :(得分:0)

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

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;
}

备注:远程对等方必须位于同一LAN上。
另一点注意:如果IP地址不存在,您将获得一个用于MAC的空字符串。

答案 2 :(得分: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;
        }
    }
}