Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt/C++;:如何获取远程PC(通信对等机)MAC地址?_Qt_Sockets_Tcp_Mac Address_Peer - Fatal编程技术网

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

Qt/C++;:如何获取远程PC(通信对等机)MAC地址?,qt,sockets,tcp,mac-address,peer,Qt,Sockets,Tcp,Mac Address,Peer,我正在Windows 7上使用Qt5。 在我的应用程序(TCP服务器)中,我目前正在使用QTcpSocket类中的一些方法: -QAbstractSocket::peerAddress()以获取对等地址 -QAbstractSocket::peerPort()以获取对等端口 我还想获取通信对等方的MAC地址。 这是否可能,无需使用自定义协议(即无需在我的应用程序和对等方之间交换一些自定义消息)?如果是,如何进行 后期编辑:现在有-我几个月前实施的。我同时测试了它,它100%完美地工作。享受:)一

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

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


后期编辑:现在有-我几个月前实施的。我同时测试了它,它100%完美地工作。享受:)

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

(上述情况的一个次要例外:如果您通过IPv6进行通信,并且使用自分配的链路本地IPv6地址(例如fe80::blah),可以从计算机的自行分配的IPv6地址中删除计算机的MAC地址,因为自行分配的IPv6地址通常从MAC地址派生,并包含MAC地址作为其IPv6地址的子集。[注意,这在Internet上不起作用,因为只有当两台机器位于同一LAN上时,链接本地地址才有用])


如果远程对等机与程序主机位于同一LAN上(且LAN为以太网LAN),则该程序可能正在使用某些Windows特定的API在计算机的ARP表中查找IPAddressMassaAddress映射。如果远程对等方位于Internet上的其他位置,则我不知道它是如何做到的。

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

(上述情况的一个次要例外:如果您通过IPv6进行通信,并且使用自分配的链路本地IPv6地址(例如fe80::blah),可以从计算机的自行分配的IPv6地址中删除计算机的MAC地址,因为自行分配的IPv6地址通常从MAC地址派生,并包含MAC地址作为其IPv6地址的子集。[注意,这在Internet上不起作用,因为只有当两台机器位于同一LAN上时,链接本地地址才有用])


如果远程对等机与程序主机位于同一LAN上(且LAN为以太网LAN),则该程序可能正在使用某些特定于Windows的API在计算机的ARP表中查找IPAddressMassaAddress映射。如果远程对等机位于Internet上的其他位置,则我不知道它是如何做到的。

以下是获取通信对等机MAC地址的代码。
在引擎盖下,它使用Windows命令。
使用在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;
}
备注:远程对等方必须位于同一局域网上。

另一句话:如果IP地址不存在,您将获得MAC的空字符串。

以下是获取通信对等方MAC地址的代码。
在引擎盖下,它使用Windows命令。
使用在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;
}
备注:远程对等方必须位于同一局域网上。

另一句话:如果IP地址不存在,您将得到MAC的空字符串。

如果您可以在远程对等机上运行代码,则可以通过调用接口来报告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;
        }
    }
}
for(const-QNetworkInterface&iface:QNetworkInterface::allInterfaces()){
if(iface.type()==QNetworkInterface::Wifi){

qDebug()若您可以在远程对等机上运行代码,则可以通过调用接口报告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;
        }
    }
}
for(const-QNetworkInterface&iface:QNetworkInterface::allInterfaces()){
if(iface.type()==QNetworkInterface::Wifi){
qDebug()