Qt/C++;:如何获取远程PC(通信对等机)MAC地址?
我正在Windows 7上使用Qt5。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%完美地工作。享受:)一
在我的应用程序(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()