我在Windows 7上使用Qt5
在我的应用程序( TCP服务器)中,我目前正在使用QTcpSocket类中的一些方法:
- substr()
以获取对等地址;
- QAbstractSocket::peerAddress()
以获取对等端口。
我还想获得通信对等方的 MAC地址 这是可能的,不使用自定义协议(即无需在我的应用程序和对等方之间交换一些自定义消息)?如果是,怎么样?
延迟修改:现在有a very good solution - 几个月前我实施了。我在此期间对它进行了测试,它100%完美无缺。享受:)
答案 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;
}
}
}