在Qt Network模块中使用QHostAddress存放IP地址,QHostInfo类来获取主机名和IP。
进行TCP/UDP编程时,需要将连接的主机名解析为IP地址,这个操作用DNS协议执行。
在互联网中现在有两种IP类型:IVP4和IVP6。
IP地址是给每一个连接在互联网上的主句分配的唯一地址,用来进行信息传递。
QHostAddress类:
常用函数:
setAddress() | 设置一个地址 |
toIPv4Address() | 以数字形式返回 IPv4 地址,如果地址为 127.0.0.1,则返回值为 2130706433 |
toIPv6Address() | 以Q_IPV6ADDR结构的形式返回 IPv6 地址。该结构由 16 个无符号字符组成。 |
toString() | 以字符串形式返回地址。 |
isSiteLocal() | 判断地址是 IPv6 站点本地地址 |
isLoopBack() | 判断地址是 IPv6 环回地址或任何 IPv4 环回地址 |
isMulticast() | 判断地址是 IPv4 或 IPv6 多播地址 |
isLinkLoacl() | 判断地址是 IPv4 或 IPv6 链路本地地址 |
isNull() | 此主机地址对任何主机或接口无效 |
isEqual() | 如果主机地址与给定的另一个地址相同,返回true 否则返回false |
isBroadcast | 判断是否为IPV4的广播地址 |
clear() | 清除 |
一些特殊地址:
QHostAddress::Null | 空地址 |
QHostAddress::LocalHost | IPv4 本地主机地址,等价于 127.0.0.1 |
QHostAddress::LocalHostIPv6 | IPv6 本地主机地址,等价于 ::1 |
QHostAddress::Broadcast | IPv4 广播地址,等价于 255.255.255.255 |
QHostAddress::AnyIPv4 | IPv4 任意地址,等价于 0.0.0.0 |
QHostAddress::AnyIPv6 | IPv6 任意地址,等价于 :: |
QHostAddress::Any | 双栈任意地址 |
QHostInfo类:
QHostInfo用来查找与主机相关联的IP地址或与IP相连的主主机名。
QHostInfo使用以下函数查找:
- 根据主机名查IP: lookupHost("主机名",this,SLOT(printResulys(QHostInfo)));
- 根据IP查主机名: lookupHost("IP",this,SLOT(printResulys(QHostInfo)));
- 终止查找:abortHostLookup()
使用堵塞查找的话使用 :fromName()函数
QHostInfo的函数:
addresses() | 返回与hostName关联的 IP 地址列表。 |
error() | 返回主机名查找失败时发生的错误类型; |
errorString() | 如果查找失败,此函数将返回错误的人类可读描述;否则返回“未知错误”。 |
fromName() | 查找给定主机名的 IP 地址,并返回QHostInfo对象 |
hostName() | 返回已查找其 IP 地址的主机的名称。 |
localDomainName() | 返回此计算机的 DNS 域 |
localHostName() | 返回此计算机的主机名,主机名不能保证全局唯一,尤其是在自动配置主机名的情况下 |
lookupHost() | 查找与主机名名称关联的 IP 地址,并返回查找的 ID。 |
lookupId() | 返回此查找的 ID。 |
setAddress() | 设置地址 |
setError() | 设置错误类型 |
setErrorString() | 设置错误信息 |
setHostName() | 设置主机名 |
setHostName(int) | 将此查找的 ID 设置为 id。 |
swap() | 交换 |
以下为简单的使用这些函数:首先创建一个项目
在.pro文件中添加:
QT+=network
获取本机的主机名和IP
QString localName=QHostInfo::localHostName();//获取本地主机名
QHostInfo info=QHostInfo::fromName(localName);//根据主机名获取QHostInfo对象
qDebug()<<tr("主机名:")<<localName;
for(const auto &s:info.addresses())//可能会有多个IP地址,一般使用第一个
{
qDebug()<<s;
}
或
QHostInfo info2;
qDebug()<<info2.localHostName();//也可以输出主机名
查找IP或主机名:(lookUpHost())
QHostInfo::lookupHost("www.baidu.com",this,[=](QHostInfo host)
{
qDebug()<<host.hostName();//输出主机名
const auto addresses = host.addresses();
for (const QHostAddress &address : addresses)
qDebug() << "Found address:" << address.toString();
});
QHostInfo::lookupHost("127.0.0.1",this,[=](QHostInfo host)
{
qDebug()<<host.hostName();//输出主机名
const auto addresses = host.addresses();
for (const QHostAddress &address : addresses)
qDebug() << "Found address:" << address.toString();
});
QNetworkInterface类
QNetworkInterface 表示连接到运行程序的主机的一个网络接口。每个网络接口可以包含零个或多个 IP 地址,每个 IP 地址都可以选择与网络掩码和/或广播地址相关联。
常用函数:
addressEntries() | 返回此接口拥有的 IP 地址列表及其关联的网络掩码和广播地址。 |
allAddresses() | 返回在主机上找到的所有 IP 地址 |
allInterfaces() | 返回在主机上找到的所有网络接口的列表 |
flages() | 返回与此网络接口关联的标志 |
hardwareAddress() | 返回此接口的低级别硬件地址 |
index() | 返回接口系统索引,这是操作系统分配的用于标识此接口的整数,通常不会更改。它与 IPv6 地址中的范围 ID 字段匹配。 |
name() | 返回此网络接口的名称 |
isValid() | 判断Q包含NetworkInterfaced对象是否有关网络接口的有效信息 |
type() | 返回此接口的类型 |
maximumTransmissionUnit() | 返回此接口上的最大传输单位(如果已知) |
interfaceFromIndex(int index) | 返回内部ID为index的QNetworkInterface对象 |
interfaceFromName(QString name) | 返回名为name的QNetworkInterface对象 |
interfaceIndexNameFrom(QString name) | 返回名称为 name 的接口的索引,如果没有具有该名称的接口,则返回 0 |
interfaceNameFromIndex(int index) | 返回其索引为索引的接口的名称,如果没有具有该索引的接口,则返回空字符串 |
网络相关的标志:
QNetworkInterface::InterfaceFlag
QNetworkInterface::IsUp | 网络接口为“启动” |
QNetworkInterface::IsRunning | 网络接口可操作 |
QNetworkInterface::CanBroadcast | 网络接口在广播模式下工作 |
QNetworkInterface::IsLoopBack | 网络接口是环回接口:也就是说,它是一个虚拟接口,其目标是主机本身 |
QNetworkInterface::IsPointToPoint | 网络接口是一个点对点接口:也就是说,有一个单独的地址可以直接由它访问。 |
QNetworkInterface::CanMulticast | 网络接口支持多播 |
注意事项:一个网络接口不能既基于广播又基于点对点
输出网络接口信息:
QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();//获取全部网络接口列表
for(auto t:list)
{
qDebug()<<"接口名称"<<t.name();//接口名称
qDebug()<<"硬件地址"<<t.hardwareAddress();//硬件地址
QList<QNetworkAddressEntry> list=t.addressEntries();//获取IP地址条目列表(IP,子网掩码,广播地址)
for(auto m:list)
{
qDebug()<<"IP地址"<<m.ip().toString();//输出IP地址
qDebug()<<"子网掩码"<<m.netmask().toString();//输出子网掩码
qDebug()<<"广播地址"<<m.broadcast().toString();//输出广播地址
}
}
QDnsLookup类
QDnsLookup 使用操作系统提供的机制来执行 DNS 查找。(Qt 5.0引入)
常用函数:
error() | 保存 查找DNS 失败时发生的错误类型 |
errorSting() | 此属性包含 查找DNS 失败时错误的人类可读说明。 |
name() | 此属性保存要查找的名称。 |
nameServer() | 此属性保存用于 DNS 的名称服务器。 |
type() | DNS 的类型 |
QDnsLookup() | 构造 QDnsLookup 对象 |
abort() | 中止 DNS 查找操作 |
finished() | 完成 DNS 查找 |
lookup() | 开启DNS 查找 |
canonicalNameRecords() | 返回与此查找关联的规范名称记录的列表 |
hostAddressRecords() | 返回与此查找关联的主机地址记录的列表 |
isDone() | 返回答复是已完成还是已中止 |
mailExchangRecords() | 返回与此查找关联的名称服务器记录的列表 |
pointerRecords() | 返回与此查找关联的指针记录的列表 |
serviceRecords() | 返回与此查找关联的服务记录的列表 |
textRecords() | 返回与此查找关联的文本记录的列表 |
QDnsLookup::Type
QDnsLookup::A | IPv4 地址记录 |
QDnsLookup::AAAA | IPv6 地址记录 |
QDnsLookup::ANY | 任何记录 |
QDnsLookup::CNAME | 规范名称记录 |
QDnsLookup::MX | 邮件交换记录 |
QDnsLookup::NS | 名称服务器记录 |
QDnsLookup::PTR | 指针记录 |
QDnsLookup::SRV | 服务记录 |
QDnsLookup::TXT | 文本记录 |
使用Dns查找:
QDnsLookup * dnslk=new QDnsLookup(this);
connect(dnslk,&QDnsLookup::finished,[=]()//回复完成处理时
{
if(dnslk->error()!=QDnsLookup::NoError)//如果出现错误
{
qWarning("DNS 查询失败");
dnslk->deleteLater();//稍后删除
return;
}
//这里可以获取一些需要的信息
//返回与此查找关联的规范名称记录的列表
//返回与此查找关联的服务记录的列表等记录
dnslk->deleteLater();
});
dnslk->setType("");//查找记录对应的类型
dnslk->setName();//设置需要查找的DNS名称
dnslk->lookup();//开始查找