该需求为QT获取本机的设备名、mac地址与IP地址。点击登录后发送到服务器
使用网络通信需要在pro文件后加上 network
获取设备名:
QString machineName = QHostInfo::localHostName();
获取MAC地址
// 获取所有网络接口列表
QList<QNetworkInterface> nets = QNetworkInterface::allInterfaces();
// 遍历接口
int nCnt = nets.count();
QString strMacAddr = "";
for (int i = 0; i < nCnt; i++)
{
// 网络接口需被激活且正在运行且不是回环地址,才可能是要找的地址
if (nets[i].flags().testFlag(QNetworkInterface::IsUp) &&
nets[i].flags().testFlag(QNetworkInterface::IsRunning) &&
!nets[i].flags().testFlag(QNetworkInterface::IsLoopBack))
{
// 该mac的ip地址不能是回环地址并且是ipv4地址
for (int j = 0; j < nets[i].addressEntries().size(); j++)
{
if (nets[i].addressEntries().at(j).ip() != QHostAddress::LocalHost &&
nets[i].addressEntries().at(j).ip().protocol() == QAbstractSocket::IPv4Protocol)
{
strMacAddr = nets[i].hardwareAddress();
}
}
}
}
获取ip地址
// 获取所有网络接口列表
QList<QNetworkInterface> ipnets = QNetworkInterface::allInterfaces();
// 遍历接口
int ipnCnt = ipnets.count();
QString strIpAddr = "";
for (int i = 0; i < ipnCnt; i++)
{
// // 网络接口需被激活且正在运行且不是回环地址,才可能是要找的地址
if (ipnets[i].flags().testFlag(QNetworkInterface::IsUp) &&
ipnets[i].flags().testFlag(QNetworkInterface::IsRunning) &&
!ipnets[i].flags().testFlag(QNetworkInterface::IsLoopBack))
{
// 该mac的ip地址不能是回环地址并且是ipv4地址
for (int j = 0; j < nets[i].addressEntries().size(); j++)
{
if (nets[i].addressEntries().at(j).ip() != QHostAddress::LocalHost &&
nets[i].addressEntries().at(j).ip().protocol() == QAbstractSocket::IPv4Protocol)
{
strIpAddr = nets[i].addressEntries().at(j).ip().toString();
}
}
}
}
发送到服务器:
//QNetworkRequest 该类通过一个URL地址发起网络协议请求,也保存网络请求的信息
QNetworkRequest request;
//QNetworkAccessManager 该类用于协调网络操作,负责发起网络请求,创建网络响应
QNetworkAccessManager * manager = new QNetworkAccessManager();
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
//以百度为例
request.setUrl(QUrl("https://www.baidu.com"));
//QNetworkReply表示网络请求的响应,在QNetworkAccessManager 类发出网络请求后,创建一个网络响应。由该类提供的信号可以监测网络响应的情况
QNetworkReply *reply = manager->post(request, sendData.toUtf8());
QObject::connect(reply, &QNetworkReply::finished, this, [reply]() {
if (reply->error() == QNetworkReply::NoError) {
qDebug("a");
QByteArray data = reply->readAll();
qDebug() << data;
}
else {
qDebug() << "Error: " << reply->errorString();
reply->deleteLater();
//qApp->quit();
}
});
程序执行过程中输出了这个错误:Error: Error creating SSL context ()
这是由于缺少相关库文件造成,去\Qt5.9.1\Tools\QtCreator\bin目录下,找到libeay32.dll和ssleay32.dll拷贝到exe同级目录下,即可。若是没有ssleay32.dll,则找到libssl32.dll,将名字改为ssleay32.dll即可。因为ssleay32.dll和libssl32.dll是一个东西