QHostAddress
功能:
- QHostAddress类提供了一个IP地址信息。这个类可以提供与平台无关的,支持IPv4和IPv6的IP地址信息。
- QHostAddress通常都与QTcpSocket, QTcpServer和QUdpSocket一起配合使用,它可以用来辅助连接一个主机,或者辅助启动一个服务器。
- setAddress()可以指定QHostAdress的IP地址。toIPv4Address(), toIPv6Address(), 或者toString()可以获取IP地址值。protocol()可以用来检查协议的类型。
- 注意:QHostAddress不用于DNS查找,QHostInfo可以用于DNS查找。
- 该类还支持常见的预定义地址:Null,LocalHost,LocalHostIPv6,Broadcast和Any。
- 另请参见QHostInfo,QTcpSocket,QTcpServer和QUdpSocket。
Header: #include <QHostAddress> qmake: QT += network
官方文档:https://doc.qt.io/qt-5/qhostaddress.html
ConversionMode、ConversionModeFlag
原型:
enum QHostAddress::ConversionModeFlag flags QHostAddress::ConversionMode
功能:
- 这个枚举是在Qt 5.8中引入或修改的。
- ConversionMode类型是QFlags <ConversionModeFlag>的typedef 。它存储ConversionModeFlag值的或组合。
- 另请参见isEqual()。
Constant Value 描述 QHostAddress::StrictConversion
0
比较两个不同协议的QHostAddress对象时,请勿将IPv6地址转换为IPv4 ,因此始终将它们视为不同的。 QHostAddress::ConvertV4MappedToIPv4
1
比较时转换IPv4映射的IPv6地址(RFC 4291第2.5.5.2节)。因此,QHostAddress(“ :: ffff:192.168.1.1”)将等于QHostAddress(“ 192.168.1.1”)。 QHostAddress::ConvertV4CompatToIPv4
2
比较时转换兼容IPv4的IPv6地址(RFC 4291第2.5.5.1节)。因此,QHostAddress(“ :: 192.168.1.1”)将等于QHostAddress(“ 192.168.1.1”)。 QHostAddress::ConvertLocalHost
8
比较时将IPv6回送地址转换为其等效的IPv4。因此,例如QHostAddress(“ :: 1”)将等于QHostAddress(“ 127.0.0.1”)。 QHostAddress::ConvertUnspecifiedAddress
4
所有未指定的地址将比较相等,即AnyIPv4,AnyIPv6和Any。 QHostAddress::TolerantConversion
0xff
设置所有前面的三个标志。
SpecialAddress
原型:
enum QHostAddress::SpecialAddress
功能:
Constant Value 描述 QHostAddress::Null
0
空地址对象。等效于QHostAddress()。另请参见QHostAddress :: isNull()。 QHostAddress::LocalHost
2
IPv4本地主机地址。等效于QHostAddress(“ 127.0.0.1”)。 QHostAddress::LocalHostIPv6
3
IPv6本地主机地址。等效于QHostAddress(“ :: 1”)。 QHostAddress::Broadcast
1
IPv4广播地址。等效于QHostAddress(“ 255.255.255.255”)。 QHostAddress::AnyIPv4
6
IPv4任意地址。等效于QHostAddress(“ 0.0.0.0”)。与此地址绑定的套接字将仅在IPv4接口上侦听。 QHostAddress::AnyIPv6
5
IPv6任意地址。等效于QHostAddress(“ :: ”)。与此地址绑定的套接字将仅在IPv6接口上侦听。 QHostAddress::Any
4
双堆栈任意地址。与此地址绑定的套接字将在IPv4和IPv6接口上侦听
QHostAddress
原型:
QHostAddress::QHostAddress(QHostAddress::SpecialAddress address) QHostAddress::QHostAddress(const QHostAddress &address) QHostAddress::QHostAddress(const QString &address) QHostAddress::QHostAddress(const sockaddr *sockaddr) QHostAddress::QHostAddress(const Q_IPV6ADDR &ip6Addr) QHostAddress::QHostAddress(const quint8 *ip6Addr) QHostAddress::QHostAddress(quint8 *ip6Addr) QHostAddress::QHostAddress(quint32 ip4Addr) QHostAddress::QHostAddress()
功能:
- 构造主机地址对象
operator =
原型:
QHostAddress &QHostAddress::operator=(const QString &address) QHostAddress &QHostAddress::operator=(const QHostAddress &address)
~QHostAddress()
原型:
QHostAddress::~QHostAddress()
功能:
- 销毁主机地址对象。
clear
原型:
void QHostAddress::clear()
功能:
将主机地址设置为null并将协议设置为QAbstractSocket :: UnknownNetworkLayerProtocol。
另请参见QHostAddress :: Null。
isBroadcast
原型:
bool QHostAddress::isBroadcast() const
功能:
- 如果地址是IPv4广播地址则返回true,否则返回false。IPv4广播地址为255.255.255.255。
- 注意,对于IPv4网络的本地广播地址,这个函数不会返回true。请使用QNetworkInterface获取本机的广播地址。
- 这个函数是在Qt 5.11中引入的。
- 另请参见isLoopback(),isGlobal(),isMulticast(),isLinkLocal()和isUniqueLocalUnicast()。
isEqual
原型:
bool QHostAddress::isEqual(const QHostAddress &other, QHostAddress::ConversionMode mode = TolerantConversion) const
功能:
如果该主机地址与给定的另一个地址相同则返回true;否则返回false。
参数模式控制在不同协议的地址之间进行哪些转换。如果没有指定模式,默认情况下执行宽容转换。
这个函数是在Qt 5.8中引入的。
另请参见ConversionMode和operator ==()。
isGlobal
原型:
bool QHostAddress::isGlobal() const
功能:
如果地址是IPv4或IPv6的全局地址则返回true,否则返回false。全局地址是不为特殊目的(如环回或多播)或未来目的保留的地址。
- 请注意,IPv6唯一本地单播地址被认为是全球地址(参见isUniqueLocalUnicast()),正如RFC 1918为本地网络保留的IPv4地址一样。
- 还要注意的是IPv6站点本地地址已被弃用,在新的应用中应该被视为全局地址。对于站点本地地址,这个函数也返回true。
- 这个函数是在Qt 5.11中引入的。
- 另请参见isLoopback(),isSiteLocal()和isUniqueLocalUnicast()。
isInSubnet
原型:
bool QHostAddress::isInSubnet(const QHostAddress &subnet, int netmask) const bool QHostAddress::isInSubnet(const QPair<QHostAddress, int> &subnet) const
功能:
- 如果此IP在由网络前缀subnet和netmask netmask描述的子网中,则返回true。
- 如果IP包含在子网中的最低地址和最高地址之间,则认为它属于该子网。在IPv4的情况下,最低的地址是网络地址,而最高的地址是广播地址。
- subnet参数不必是实际的网络地址(子网中最低的地址)。它可以是属于该子网的任何有效IP。特别是,如果它等于该节点持有的IP地址,该函数将始终返回true(提供netmask为有效值)。
- 这个函数是在Qt 4.5中引入的。
- 另请参见parseSubnet()。
isLinkLocal
原型:
bool QHostAddress::isLinkLocal() const
功能:
- 如果地址是IPv4或IPv6链路本地地址则返回true,否则返回false。
- IPv4链路本地地址是指网络169.254.0.0/16中的地址。IPv6链路本地地址是fe80::/10网络中的地址。
- 这个函数是在Qt 5.11中引入的。
- 另请参见isLoopback(),isGlobal(),isMulticast(),isSiteLocal()和isUniqueLocalUnicast()
isLoopback
原型:
bool QHostAddress::isLoopback() const
功能:
- 如果地址是IPv6的环回地址或IPv4的环回地址,返回true。
isMulticast
原型:
bool QHostAddress::isMulticast() const
功能:
- 如果地址是IPv4或IPv6组播地址则返回true,否则返回false。
- 这个函数是在Qt 5.6中引入的。
- 另请参见isLoopback(),isGlobal(),isLinkLocal(),isSiteLocal()和isUniqueLocalUnicast()
isNull
原型:
bool QHostAddress::isNull() const
功能:
- 如果此主机地址对任何主机或接口无效,则返回true。
- 默认构造函数创建一个空地址。
- 另请参见QHostAddress :: Null。
isSiteLocal
原型:
bool QHostAddress::isSiteLocal() const
功能:
- 如果地址是IPv6站点本地地址则返回true,否则返回false。
- IPv6站点本地地址是fec0::/10网络中的站点本地地址。
- IPv6站点本地地址已弃用,在新的应用中不应依赖。新的应用程序不应该依赖于这个函数,而应该将站点本地地址视为与global相同的地址(这就是为什么isGlobal()也返回true)。站点本地地址被唯一本地地址(ULA)取代。
- 这个函数是在Qt 5.11中引入的。
- 另请参见isLoopback(),isGlobal(),isMulticast(),isLinkLocal()和isUniqueLocalUnicast()。
isUniqueLocalUnicast
原型:
bool QHostAddress :: isUniqueLocalUnicast()const
功能:
- 如果地址是IPv6唯一的本地单播地址则返回true,否则返回false。
- 本地唯一的IPv6单播地址是网络fc00::/7中的地址。
- 注意,唯一的本地单播地址也算作全局地址。RFC 4193说,在实践中,“应用程序可以将这些地址视为全局作用域地址。”只有路由器才需要关心这种区别。
- 此功能在Qt 5.11中引入。
- 另请参见isLoopback(),isGlobal(),isMulticast(),isLinkLocal()和isUniqueLocalUnicast()。
parseSubnet
原型:
[static] QPair<QHostAddress, int> QHostAddress::parseSubnet(const QString &subnet)
功能:
- 解析子网中包含的IP和子网信息,并返回该网络的网络前缀及其前缀长度。
- IP地址和子网掩码之间用“/”分隔。
这个函数支持如下形式的参数:
123.123.123.123/n,其中n是0到32之间的任意值
23.123.123.123/255.255.255.255
<ipv6-address>/n,其中n为0到128之间的任意值
- 对于IP版本4,此功能还接受缺少的尾随组件(即少于4个八位位组,例如“ 192.168.1”),后跟一个点或不一个点。如果在这种情况下也缺少网络掩码,则将其设置为实际传递的八位字节数(在上面的示例中,对于3个八位字节,它将为24)。
此功能在Qt 4.5中引入。
另请参见isInSubnet()
protocol
原型:
QAbstractSocket :: NetworkLayerProtocol QHostAddress :: protocol()const
功能:
- 返回主机地址的网络层协议。
scopeId
原型:
QString QHostAddress :: scopeId()const
功能:
返回IPv6地址的作用域ID。对于IPv4地址,或者如果该地址不包含作用域ID,则返回一个空的QString。
IPv6的范围ID指定的范围可达性非全球IPv6地址,限制了可使用的地址的区域。所有IPv6地址都与这样的可达性范围相关联。范围ID用于消除不能保证全局唯一的地址的歧义。
IPv6指定以下四个级别的可达性:
- 本地节点:仅用于与同一接口(例如,环回接口“ :: 1”)上的服务进行通信的地址。
- 本地链接:网络接口本地链接(link)的地址。主机上每个IPv6接口始终有一个链接本地地址。链接本地地址(“ fe80 ...”)是从本地网络适配器的MAC地址生成的,并且不能保证唯一。
- 全局:用于可全局路由的地址,例如Internet上的公共服务器。
将本地链接地址或站点本地地址用于IPv6连接时,必须指定作用域ID。链接本地地址的作用域ID通常与接口名称(例如“ eth0”,“ en1”)或数字(例如“ 1”,“ 2”)相同。
此功能在Qt 4.1中引入。
另请参见setScopeId(),QNetworkInterface和QNetworkInterface :: interfaceFromName。
setAddress
原型:
void QHostAddress::setAddress(quint32 ip4Addr) void QHostAddress::setAddress(quint8 *ip6Addr) void QHostAddress::setAddress(const quint8 *ip6Addr) void QHostAddress::setAddress(const Q_IPV6ADDR &ip6Addr) void QHostAddress::setAddress(const sockaddr *sockaddr) bool QHostAddress::setAddress(const QString &address) void QHostAddress::setAddress(QHostAddress::SpecialAddress address)
功能:
setScopeId
原型:
void QHostAddress::setScopeId(const QString &id)
功能:
- 将地址的IPv6作用域ID设置为id。如果地址协议不是IPv6,则此功能不执行任何操作。范围ID可以设置为接口名称(例如“ eth0”或“ en1”)或表示接口索引的整数。如果id是接口名称,则QtNetwork将在调用操作系统网络功能之前使用QNetworkInterface :: interfaceIndexFromName()转换为接口索引。
- 此功能在Qt 4.1中引入。
- 另请参见scopeId(),QNetworkInterface和QNetworkInterface :: interfaceFromName。
swap
原型:
void QHostAddress::swap(QHostAddress &other)
功能:
- 与其他交换该主机地址。此操作非常快,并且永远不会失败。
- 此功能在Qt 5.6中引入。
toIPv4Address
原型:
quint32 QHostAddress::toIPv4Address() const quint32 QHostAddress::toIPv4Address(bool *ok) const
功能:
- 以数字形式返回IPv4地址。
- 例如,如果地址为127.0.0.1,则返回值为2130706433(即0x7f000001)
- 如果 protocol() 是IPv4Protocol,或者协议是IPv6Protocol,并且IPv6地址是IPv4映射的地址,则此值有效。(RFC4291)
- 另请参见toString()。
toIPv6Address
原型:
Q_IPV6ADDR QHostAddress::toIPv6Address() const
功能:
- 以Q_IPV6ADDR结构形式返回IPv6地址。结构由16个无符号字符组成。
Q_IPV6ADDR addr = hostAddr.toIPv6Address(); // addr contains 16 unsigned characters for (int i = 0; i < 16; ++i) { // process addr[i] }
- 如果 protocol() 为IPv6Protocol,则此值有效。如果协议是IPv4Protocol,则返回该地址一个IPv4映射的IPv6地址。(RFC4291)
- 另请参见toString()。
toString
原型:
QString QHostAddress::toString() const
功能:
- 以字符串形式返回地址。
例如,如果地址是IPv4地址127.0.0.1,则返回的字符串是“ 127.0.0.1”。对于IPv6,字符串格式将遵循RFC5952建议。对于QHostAddress :: Any,将返回其IPv4地址(“ 0.0.0.0”)
另请参见toIPv4Address()。
实践
1. 创建一个工程
2. 引入network模块
在netstat.pro中加上网络模块
#include <QCoreApplication>
#include <QDebug>
#include <QHostAddress>
#include <QNetworkInterface>
#define qcout qDebug()
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QHostAddress address = QHostAddress(QHostAddress::LocalHost);
QString strIPAddress = address.toString();
qcout << strIPAddress; // "127.0.0.1"
QHostAddress ad01;
ad01.setAddress("127.0.0.2"); // "127.0.0.2"
qcout << ad01.toString();
// 返回主机上面的所有IP地址
QList<QHostAddress> list = QNetworkInterface::allAddresses();
foreach (QHostAddress address, list){
// 主机地址为空
if (address.isNull())
continue;
qcout << "********************";
QAbstractSocket::NetworkLayerProtocol nProtocol = address.protocol();
QString strScopeId = address.scopeId();
QString strAddress = address.toString();
bool bLoopback = address.isLoopback();
qcout << "Protocol : " << nProtocol; // QAbstractSocket::NetworkLayerProtocol(IPv4Protocol)
qcout << "ScopeId : " << strScopeId; // ""
qcout << "Address : " << strAddress; // "223.3.81.245"
qcout << "IsLoopback : " << bLoopback; // false
// 如果是IPv4
if (nProtocol == QAbstractSocket::IPv4Protocol)
{
bool bOk = false;
quint32 nIPV4 = address.toIPv4Address(&bOk);
if (bOk)
qcout << "IPV4 : " << nIPV4;
}
// 如果是IPv6
else if (nProtocol == QAbstractSocket::IPv6Protocol)
{
QStringList IPV6List("");
Q_IPV6ADDR IPV6 = address.toIPv6Address();
for (int i = 0; i < 16; ++i)
{
quint8 nC = IPV6[i];
IPV6List << QString::number(nC);
}
qcout << "IPV6 : " << IPV6List.join(" ");
}
}
return a.exec();
}