本节是对基于QT的网络编程初步学习,QHostInfo的作用是查询本地主机或者指定主机的域名或地址IP。QNetworkInterface库提供的函数主要是查询主机的网络接口信息。
首先,需要在项目的**.pro文件中添加一行QT +=network,然后在头文件中加入
#include<QHostInfo>
#include<QNetworkInterface>方便全局调用
*这些库里面的函数就不介绍了,详细查阅帮助文档
以下是实列:
查询主机的名称和IP:
void MainWindow::on_btnGetHostInfo_clicked() //获取主机名称和IP
{
QString hostname = QHostInfo::localHostName();//获取主机名称
ui->textEdit->appendPlainText("计算机名称:"+hostname);
QHostInfo hostinfo=QHostInfo::fromName(hostname);//通过主机名称获取IP列表
QList<QHostAddress>list= hostinfo.addresses();
if(list.isEmpty()){
return;
}
//遍历IP列表中的项,如果勾选了显示ipv4,其他的遍历到的就跳出遍历下一个项
foreach (auto host, list) {
bool x=ui->chkBox_OnlyIPv4->isChecked();
if(x&&host.protocol()!=QAbstractSocket::IPv4Protocol){continue;}
//host.protocol()的返回值是枚举量,如果想显示协议类型名称需要转换一下,这里写了一个protoconame用于转换
ui->textEdit->appendPlainText("协议类型:"+protoconame(host.protocol()));
ui->textEdit->appendPlainText(host.toString());
ui->textEdit->appendPlainText(QString("isGlobal=%1\n").arg(host.isGlobal()));//isGlobal返回一个布尔值变量,如果再加上一个字符串会显示异常,需要用Qstring转换成一个统一的字符串
}
}
hostinfo.addresses()的返回值是一个列表,创建一个对应类型的列表存放,在查询的时候通过foreach遍历出来,如果勾选了ipv4就continue,去遍历列表中的下一个项。
host.protocol()的返回值是枚举类型,
想要显示出来需要转换一下,编写的转换函数如下:
QString MainWindow::protoconame(QAbstractSocket::NetworkLayerProtocol protocol)//protocol是枚举量,根据输入的值转换成对应的字符串
{
switch (protocol) {
case QAbstractSocket::IPv4Protocol:
return "Ipv4";
case QAbstractSocket::IPv6Protocol:
return "Ipv6";
default:
return "Unknow";
}
}
该部分功能运行效果如下:
勾选了只显示ipv4的查询:
没有勾选ipv4的查询:
再是查询指定域名的名称和IP等,原理和上面的功能差不多,可以用上面的方法直接查询,这里提供了一个函数
lookupHost函数第三种使用方式第一个参数是域名,第二个参数是接收者,一般是this,第三个是槽函数,该函数的功能是将域名传递给槽函数创建成对象进行查询,有点像前面的fromname功能。以下是具体实现:
void MainWindow::on_btnLookup_clicked()//查询域名的IP地址
{
QString name=ui->comboBox->currentText();
QHostInfo::lookupHost(name,this,SLOT(do_look(QHostInfo)));//这个函数的作用是将第一个参数传递给menber函数生成一个对象,相当于fromname的作用,推荐异步调用
}
void MainWindow::do_look(const QHostInfo &host)//menber槽函数
{
QList<QHostAddress>list= host.addresses();
ui->textEdit->appendPlainText("计算机名称:"+host.hostName());
if(list.isEmpty()){
return;
}
//遍历IP列表中的项,如果勾选了显示ipv4,其他的遍历到的就跳出遍历下一个项
foreach (auto host2, list) {
bool x=ui->chkBox_OnlyIPv4->isChecked();
if(x&&host2.protocol()!=QAbstractSocket::IPv4Protocol){continue;}
//host.protocol()的返回值是枚举量,如果想显示协议类型名称需要转换一下,这里写了一个protoconame用于转换
ui->textEdit->appendPlainText("协议类型:"+protoconame(host2.protocol()));
ui->textEdit->appendPlainText(host2.toString());
ui->textEdit->appendPlainText(QString("isGlobal=%1\n").arg(host2.isGlobal()));//isGlobal返回一个布尔值变量,如果再加上一个字符串会显示异常,需要用Qstring转换成一个统一的字符串
}
}
QNetworkInterface的应用
QNetworkInterface::allAddresses()的作用就是查询主机所有网络接口的地址
void MainWindow::on_btnAllAddress_clicked()//QNetworkInterface::allAddresses()可以获取主机上的所有网络接口地址
{
QList<QHostAddress>list= QNetworkInterface::allAddresses();
if(list.isEmpty()){
return;
}
//遍历IP列表中的项,如果勾选了显示ipv4,其他的遍历到的就跳出遍历下一个项
foreach (auto host, list) {
bool x=ui->chkBox_OnlyIPv4->isChecked();
if(x&&host.protocol()!=QAbstractSocket::IPv4Protocol){continue;}
//host.protocol()的返回值是枚举量,如果想显示协议类型名称需要转换一下,这里写了一个protoconame用于转换
ui->textEdit->appendPlainText("协议类型:"+protoconame(host.protocol()));
ui->textEdit->appendPlainText(host.toString());
ui->textEdit->appendPlainText(QString("isGlobal=%1\n").arg(host.isGlobal()));//isGlobal返回一个布尔值变量,如果再加上一个字符串会显示异常,需要用Qstring转换成一个统一的字符串
}
}
QNetworkInterface::allInterfaces()的作用是查询所有网络接口的信息:
其中interface.type()返回值是枚举量需要转换一下
转换函数如下:
QString MainWindow::interFace(QNetworkInterface::InterfaceType type)//将interfacetype以字符串形式转换出来
{
switch (type) {
case 0:
return "Unknown";
case 1:
return "Loopback";
case 2:
return "Virtual";
case 3:
return "Ethernet";
case 4:
return "Slip";
case 5:
return "CanBus";
case 6:
return "Ppp";
case 7:
return "Fddi";
case 8:
return "Wifi";
case 9:
return "Ieee80211 = Wifi";
case 10:
return "Phonet";
case 11:
return "Ieee802154";
case 12:
return "SixLoWPAN";
case 13:
return "Ieee80216";
case 14:
return "Ieee1394";
default:
return"没有找到类型";
}
/*
enum InterfaceType {
Loopback = 1,
Virtual,
Ethernet,
Slip,
CanBus,
Ppp,
Fddi,
Wifi,
Ieee80211 = Wifi, // alias
Phonet,
Ieee802154,
SixLoWPAN, // 6LoWPAN, but we can't start with a digit
Ieee80216,
Ieee1394,
Unknown = 0
};
*/
}
void MainWindow::on_btnAllInterface_clicked()
{
QList<QNetworkInterface>list= QNetworkInterface::allInterfaces();
if(list.isEmpty()){
return;
}
//遍历IP列表中的项,如果勾选了显示ipv4,其他的遍历到的就跳出遍历下一个项
foreach (auto interface, list) {
if(!interface.isValid()){continue;}
ui->textEdit->appendPlainText("网络接口名称:"+interface.humanReadableName());
ui->textEdit->appendPlainText("硬件地址:"+interface.hardwareAddress());
ui->textEdit->appendPlainText("接口类型:"+interFace(interface.type())); // interFace是上面写的函数,interface是局内变量
}
}
运行效果如下: