0.前置知识
-
Socket是不同主机之间通信的API
IP地址用于区分不同主机/端口用于区分不用应用 -
QHostInfo 可查找与主机名相关联的 IP 地址或与 IP 地址相关联的主机名。 该类提供了两个静态便利函数:一个是异步函数,在找到主机后发出信号;另一个是阻塞函数,返回一个 QHostInfo 对象。
-
QNetworkInterface 表示连接到运行程序所在主机的一个网络接口。
-
QNetworkAddressEntry 每个网络接口可包含零个或多个 IP 地址,这些地址又可与网络掩码和/或广播地址相关联(取决于操作系统的支持情况)。
1.实战代码
1. 获取主机名称以及主机名称对应的IP地址
// 获取主机名称QString strLocalHostName = QHostInfo::localHostName();ui->lineEdit->setText(strLocalHostName);// 根据主机名称获取对应的IP地址QString strLocalAddress = "";QHostInfo hostinfo = QHostInfo::fromName(strLocalHostName);QList<QHostAddress> ipaddresslist = hostinfo.addresses();if (!ipaddresslist.isEmpty()){for (int i = 0; i < ipaddresslist.size(); i++){QHostAddress addresshost = ipaddresslist[i];if(QAbstractSocket::IPv4Protocol == addresshost.protocol()){strLocalAddress = addresshost.toString();break;}}}ui->lineEdit_2->setText(strLocalAddress);
2. 返回主机找到的所有网络接口列表 + IP地址对应的信息
QString strTemp = "";// 返回主机所找到的所有网络接口的列表QList<QNetworkInterface> netlist = QNetworkInterface::allInterfaces();for (int i = 0;i < netlist.size(); i++){QNetworkInterface interfaces = netlist.at(i);strTemp = strTemp + "设备名称:" + interfaces.name() + "\n"; // 获取设备名称strTemp = strTemp + "硬件地址:" + interfaces.hardwareAddress() + "\n"; // 获取硬件地址QList<QNetworkAddressEntry> entrylist = interfaces.addressEntries(); // 遍历每个IP地址对应的信息for (int j = 0; j < entrylist.size(); j++){QNetworkAddressEntry entry = entrylist.at(j);strTemp = strTemp + "IP地址:" + entry.ip().toString() + "\n";strTemp = strTemp + "子网掩码:" + entry.netmask().toString() + "\n";strTemp = strTemp + "广播地址:" + entry.broadcast().toString() + "\n";}}QMessageBox::information(this, "主机所有信息", strTemp, QMessageBox::Yes);
3. 查询域名或者IP地址
查询域名或IP地址类内实现
getDomainName::getDomainName(QWidget *parent): QWidget(parent), ui(new Ui::getDomainName)
{ui->setupUi(this);ui->lineEdit->setText("www.baidu.com");
}getDomainName::~getDomainName()
{delete ui;
}void getDomainName::on_pushButton_clicked()
{// 主机名称QString strHostName = ui->lineEdit->text();ui->textEdit->append("你所查询的主机信息:" + strHostName);QHostInfo::lookupHost(strHostName, this, &getDomainName::lookupHostInfoFunc);
}void getDomainName::on_pushButton_2_clicked()
{ui->textEdit->clear();
}QString getDomainName::ProtocolTypeName(QAbstractSocket::NetworkLayerProtocol protocolType){switch (protocolType) {case QAbstractSocket::IPv4Protocol:return "IPv4 Protrcol";case QAbstractSocket::IPv6Protocol:return "IPv6 Protrcol";case QAbstractSocket::AnyIPProtocol:return "Either IPv4 or IPv6 Protrcol";case QAbstractSocket::UnknownNetworkLayerProtocol:return "Unknown Protrcol";default:break;}
}void getDomainName::lookupHostInfoFunc(const QHostInfo &host)
{QList<QHostAddress> addresslist = host.addresses();for (int i = 0; i < addresslist.size(); i++){QHostAddress host = addresslist.at(i);ui->textEdit->append("协议类型:" + ProtocolTypeName(host.protocol()));ui->textEdit->append("主机IP地址:" + host.toString());ui->textEdit->append("");}
}