【问题标题】:Qt/C++ : How to get remote PC (communication peer) MAC address?Qt/C++:如何获取远程 PC(通信对等)MAC 地址?
【发布时间】:2016-02-06 23:08:58
【问题描述】:
我在 Windows 7 上使用 Qt5。
在我的应用程序(TCP 服务器)中,我目前正在使用 QTcpSocket 类中的一些方法:
- QAbstractSocket::peerAddress() 以获取对等地址;
- QAbstractSocket::peerPort() 以获取对等端口。
我还想获取通信对等方的 MAC 地址。
这是否可能,无需使用自定义协议(即无需在我的应用程序和对等方之间交换一些自定义消息)?如果是,怎么做?
后期编辑:现在有 a very good solution - 我几个月前实施的。我同时对其进行了测试,它可以 100% 完美运行。享受:)
【问题讨论】:
标签:
qt
sockets
tcp
mac-address
peer
【解决方案1】:
这是获取通信对等方的 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 的空字符串。
【解决方案2】:
一般来说,不,这是不可能的,因为通信对等方甚至可能没有 MAC 地址(例如,如果它使用不基于以太网的网络硬件)。特别是,有关 MAC 地址的信息不通过 IP、TCP 或 UDP 层进行通信——这些层使用 IP 地址代替。因此,如果您想找出对等方的 MAC 地址,则需要在应用程序级别执行此操作,方法是让对等方上的程序将其发送给您。
(上述的一个小例外:如果您通过 IPv6 进行通信并使用自分配的链路本地 IPv6 地址(例如 fe80::blah),则可以将计算机的 MAC 地址 derive分配的 IPv6 地址,因为自分配的 IPv6 地址通常是从 MAC 地址派生的,并且包含 MAC 地址作为其 IPv6 地址的子集。[请注意,这不适用于 Internet,因为链接本地地址仅在以下情况下才有用两台机器位于同一个局域网])
如果远程对等点与程序的主机在同一个 LAN 上(并且 LAN 是以太网 LAN),那么程序可能正在使用某些 Windows 特定的 API 来查找机器的 IPAddressMACAddress 映射ARP 表。如果远程对等点位于 Internet 上的其他位置,那么我不知道它是如何做到的。
【解决方案3】:
如果您可以在远程对等体上运行代码,则可以通过接口的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;
}
}
}