QT与Web Sevice 通信

该需求为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是一个东西

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值