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("");
}
}