QHostAddress 类

QHostAddress 类提供 IP 地址。 更多...

头文件 #include <QHostAddress>
CMakefind_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmakeQT += network

公共类型

标志转换模式
枚举ConversionModeFlag { 严格转换, 转换 V4Mapped 到 IPv4, 转换 V4Compat 到 IPv4, 转换本机, 转换未指定地址, 容忍转换 }
枚举SpecialAddress { 空值, 本机, 本机 IPv6, 广播, 任何 IPv4, …, 任何 }

公共函数

QHostAddress()
QHostAddress(quint32 ip4Addr)
QHostAddress(const quint8 *ip6Addr)
QHostAddress(const Q_IPV6ADDR &ip6Addr)
QHostAddress(const sockaddr *sockaddr)
QHostAddress(const QString &address)
QHostAddress(QHostAddress::SpecialAddress address)
QHostAddress(const QHostAddress &address)
~QHostAddress()
void清晰()
boolisBroadcast() const
boolisEqual(const QHostAddress &other, QHostAddress::ConversionMode mode = TolerantConversion) const
boolisGlobal() const
boolisInSubnet(const QHostAddress &subnet, int netmask) const
boolisInSubnet(const QPair<QHostAddress, int> &subnet) const
boolisLinkLocal() const
boolisLoopback() const
boolisMulticast() const
boolisNull() const
(自 6.6) boolisPrivateUse() const
boolisSiteLocal() const
boolisUniqueLocalUnicast() const
intprotocol() const
QStringscopeId() const
voidsetAddress(quint32 ip4Addr)
voidsetAddress(const quint8 *ip6Addr)
voidsetAddress(const Q_IPV6ADDR &ip6Addr)
voidsetAddress(const sockaddr *sockaddr)
boolsetAddress(const QString &address)
voidsetAddress(QHostAddress::SpecialAddress address)
voidsetScopeId(const QString &id)
voidswap(QHostAddress &other)
quint32toIPv4Address(bool *ok = nullptr) const
Q_IPV6ADDRtoIPv6Address() const
QStringtoString() const
booloperator!=(const QHostAddress &other) const
booloperator!=(QHostAddress::SpecialAddress other) const
QHostAddress &operator=(const QHostAddress &address)
QHostAddress &operator=(QHostAddress::SpecialAddress address)
booloperator==(const QHostAddress &other) const
booloperator==(QHostAddress::SpecialAddress other) const

静态公共成员

QPair<QHostAddress, int>parseSubnet(const QString &subnet)
size_tqHash(const QHostAddress &key, size_t seed = 0)
booloperator!=(QHostAddress::SpecialAddress lhs, const QHostAddress &rhs)
QDataStream &operator<<(QDataStream &out, const QHostAddress &address)
booloperator==(QHostAddress::SpecialAddress lhs, const QHostAddress &rhs)
QDataStream &operator>>(QDataStream &in, QHostAddress &address)

详细描述

该类以一种平台和协议无关的方式持有IPv4或IPv6地址。

QHostAddress通常与QTcpSocketQTcpServerQUdpSocket一起使用,以连接到主机或设置服务器。

使用setAddress()设置主机的地址,并使用toIPv4Address(),toIPv6Address()或toString()检索地址。您可以使用protocol()检查类型。

注意:请注意,QHostAddress不会执行DNS查找。需要QHostInfo进行此操作。

该类还支持常见的预定义地址:NullLocalHostLocalHostIPv6BroadcastAny

另请参阅:QHostInfoQTcpSocketQTcpServerQUdpSocket

成员类型文档

枚举 QHostAddress::ConversionModeFlag
标志 QHostAddress::ConversionMode

常量描述
QHostAddress::StrictConversion0比较不同协议的QHostAddress对象时,不要将IPv6地址转换为IPv4,因此它们始终被视为不同。
QHostAddress::ConvertV4MappedToIPv41比较时转换IPv4映射的IPv6地址(RFC 4291第2.5.5.2节)。因此,QHostAddress("::ffff:192.168.1.1")将与QHostAddress("192.168.1.1")比较相等。
QHostAddress::ConvertV4CompatToIPv42比较时转换IPv4兼容的IPv6地址(RFC 4291第2.5.5.1节)。因此,QHostAddress("::192.168.1.1")将与QHostAddress("192.168.1.1")比较相等。
QHostAddress::ConvertLocalHost8比较时将IPv6回环地址转换为它的IPv4等效地址。例如,QHostAddress("::1")将与QHostAddress("127.0.0.1")比较相等。
QHostAddress::ConvertUnspecifiedAddress4所有未指定地址都将比较相等,即AnyIPv4、AnyIPv6和Any。
QHostAddress::TolerantConversion0xff设置前面三个标志。

ConversionMode类型是QFlags<ConversionModeFlag>的typedef。它存储了ConversionModeFlag值的或组合。

另请参阅isEqual()。

枚举QHostAddress::SpecialAddress

常量描述
QHostAddress::Null0空地址对象。等同于QHostAddress()。另请参阅QHostAddress::isNull
QHostAddress::LocalHost2IPv4localhost地址。等同于QHostAddress("127.0.0.1")。
QHostAddress::LocalHostIPv63IPv6localhost地址。等同于QHostAddress("::1")。
QHostAddress::Broadcast1IPv4广播地址。等同于QHostAddress("255.255.255.255")。
QHostAddress::AnyIPv46IPv4任何地址。等同于QHostAddress("0.0.0.0")。使用此地址绑定的套接字将只监听IPv4接口。
QHostAddress::AnyIPv65IPv6任何地址。等同于QHostAddress("::")。使用此地址绑定的套接字将只监听IPv6接口。
QHostAddress::Any4双栈任何地址。使用此地址绑定的套接字将监听IPv4和IPv6接口。

成员函数文档

QHostAddress::QHostAddress()

构造一个空的主机地址对象,即对于任何主机或接口都无效的地址。

另请参阅clear

[显式] QHostAddress::QHostAddress(quint32 ip4Addr)

使用IPv4地址ip4Addr构造主机地址对象。

[显式] QHostAddress::QHostAddress(const quint8 *ip6Addr)

使用IPv6地址ip6Addr构造主机地址对象。

ip6Addr必须是一个网络字节顺序(大端)的16字节数组。

[显式] QHostAddress::QHostAddress(const Q_IPV6ADDR &ip6Addr)

使用IPv6地址ip6Addr构造主机地址对象。

[显式] QHostAddress::QHostAddress(const sockaddr *sockaddr)

使用本地结构体 sockaddr 指定地址构建IPv4或IPv6地址。

另请参阅 setAddress

[明确] QHostAddress::QHostAddress(const QString &address)

根据字符串 address (例如,"127.0.0.1") 构建IPv4或IPv6地址。

另请参阅 setAddress

QHostAddress::QHostAddress(QHostAddress::SpecialAddress address)

address 构建一个 QHostAddress 对象。

QHostAddress::QHostAddress(const QHostAddress &address)

构建给定 address 的副本。

[不可抛出异常] QHostAddress::~QHostAddress()

销毁主机地址对象。

void QHostAddress::clear()

将主机地址设置为空,并将协议设置为 QAbstractSocket::UnknownNetworkLayerProtocol

另请参阅 QHostAddress::Null

bool QHostAddress::isBroadcast() const

如果该地址是IPv4广播地址,则返回 true,否则返回 false。IPv4广播地址为 255.255.255.255。

请注意,此函数不会为IPv4网络的本地广播地址返回true。请使用 QNetworkInterface 获取本地主机的广播地址。

另请参阅 isLoopback(), isGlobal(), isMulticast(), isLinkLocal(), isUniqueLocalUnicast() 和 isPrivateUse

bool QHostAddress::isEqual(const QHostAddress &other, QHostAddress::ConversionMode mode = TolerantConversion) const

如果此主机地址与给定的 other 地址相同,则返回 true,否则返回 false

参数 mode 控制在协议地址不同之间执行哪些转换。如果没有给 mode,则默认执行 TolerantConversion

另请参阅 ConversionModeoperator==

bool QHostAddress::isGlobal() const

如果该地址是IPv4或IPv6全局地址,则返回 true,否则返回 false。全局地址是不为特殊目的(如环回或组播)或未来目的保留的地址。

请注意,IPv6唯一本地unicast地址被视为全局地址(参见 isUniqueLocalUnicast),同样,IPv4地址由 RFC 1918 保留以用于本地网络,也被视为全局地址。

还请注意,IPv6站点本地地址已弃用,应在新的应用程序中视为全局地址。此函数也为站点本地地址返回true。

另请参阅 isLoopback(),isSiteLocal(),isUniqueLocalUnicast(),以及 isPrivateUse()。

bool QHostAddress::isInSubnet(const QHostAddress &subnet, int netmask) const

如果此IP地址在由网络前缀subnet和子网掩码netmask描述的子网中,则返回true

如果IP地址位于该子网最低地址和最高地址之间,则认为它属于该子网。在IPv4版本中,最低地址是网络地址,而最高地址是广播地址。

参数subnet不必须是实际的网络地址(子网中的最低地址)。它可以属于该子网的任何有效IP。特别是,如果它等于该对象持有的IP地址,则此函数将始终返回true(前提是子网掩码是有效值)。

另请参阅 parseSubnet

bool QHostAddress::isInSubnet(const QPair<QHostAddress, int> &subnet) const

这是一个重载函数。

如果此IP地址在由subnet描述的子网中,则返回true。子网subnetQHostAddress成员包含网络前缀,而int(第二个)成员包含子网掩码(前缀长度)。

bool QHostAddress::isLinkLocal() const

如果地址是IPv4或IPv6链路本地地址,则返回true;否则返回false

IPv4链路本地地址是169.254.0.0/16网络中的地址。IPv6链路本地地址是fe80::/10网络中的地址。有关更多信息,请参阅IANA IPv6地址空间注册表。

另请参阅 isLoopback(),isGlobal(),isMulticast(),isSiteLocal(),isUniqueLocalUnicastisPrivateUse()。

bool QHostAddress::isLoopback() const

如果地址是IPv6环回地址或任何IPv4环回地址,则返回true

bool QHostAddress::isMulticast() const

如果地址是IPv4或IPv6多播地址,则返回true;否则返回false

另请参阅 isLoopback(),isGlobal(),isLinkLocal(),isSiteLocal(),isUniqueLocalUnicast(),以及 isPrivateUse()。

bool QHostAddress::isNull() const

如果此主机地址对任何主机或接口都不是有效的,则返回true

默认构造函数创建一个空地址。

另请参阅 QHostAddress::Null

[自6.6版本起] bool QHostAddress::isPrivateUse() const

如果地址是IPv6唯一本地单播地址或IPv4地址(由RFC 1918保留供本地网络使用),则返回true,否则返回false

此函数在Qt 6.6版本中首次引入。

另请参阅isLoopback(),isGlobal(),isMulticast(),isLinkLocal(),isUniqueLocalUnicast()和isBroadcast()。

bool QHostAddress::isSiteLocal() const

如果地址是IPv6站点本地地址,则返回true,否则返回false

IPv6站点本地地址在地址块fec0::/10中。请查阅IANA IPv6地址空间注册表获取更多信息。

IPv6站点本地地址已被弃用,不应在新应用程序中依赖于它。新应用程序不应依赖此函数,并将站点本地地址视为全球地址(这也是为什么isGlobal()也返回true的原因)。站点本地地址已被唯一本地地址(ULA)取代。

另请参阅 isLoopback(), isGlobal(), isMulticast(), isLinkLocal(), isUniqueLocalUnicast() 和 isPrivateUse

bool QHostAddress::isUniqueLocalUnicast() const

如果地址是IPv6唯一本地单播地址,则返回true,否则返回false

IPv6唯一本地单播地址位于地址块fc00::/7中。请查阅IANA IPv6地址空间注册表获取更多信息。

请注意,唯一本地单播地址也视为全球地址。RFC 4193表明,在实践中,“应用程序可能将此类地址视为全球作用域地址。”只有路由器需要关心这种区别。

另请参阅isLoopback(),isGlobal(),isMulticast(),isLinkLocal(),isUniqueLocalUnicast()和isPrivateUse()。

[静态] QPair<QHostAddress, int> QHostAddress::parseSubnet(const QString &subnet)

解析子网中的IP和子网信息,并返回该网络的网络前缀及其前缀长度。

IP地址和子网掩码必须由一个斜杠(/)分隔。

此函数支持以下格式的参数

  • 123.123.123.123/n,其中n是0到32之间的任何值
  • 123.123.123.123/255.255.255.255
  • <ipv6-address>/n,其中n是0到128之间的任何值

对于IP版本4,此函数还接受缺少尾随组件的参数(即小于4个八位的字节,如"192.168.1"),后面可以跟或不跟点。如果在此情况下子网掩码也缺失,则其数值设置为实际传递的八位的数量(在上面的示例中,它将是24,对于3个八位)。

另请参阅isInSubnet()。

int QHostAddress::protocol() const

返回主机地址的网络层协议。

QString QHostAddress::scopeId() const

返回IPv6地址的范围ID。对于IPv4地址,或者如果地址不包含范围ID,则返回空QString

IPv6范围ID指定了非全局IPv6地址的可达性范围,限制了地址的使用区域。所有IPv6地址都关联了这样的可达性范围。范围ID用于区分那些不能保证全局唯一性的地址。

IPv6定义了以下四个可达性级别

  • 节点本地:仅在相同接口上的服务(例如,回环接口"::1")之间进行通信的地址。
  • 链路本地:针对网络接口(链路)本地的地址。每个主机上的IPv6接口都有一个链路本地地址。链路本地地址("fe80...")由本地网络适配器的MAC地址生成,不保证唯一。
  • 全局:用于全局可路由地址,如互联网上的公共服务器。

当使用链路本地或站点本地地址进行IPv6连接时,必须指定范围ID。链路本地地址的范围ID通常与接口名称相同(例如,“eth0”、“en1”)或为数字(例如,“1”、“2”)。

另请参阅setScopeId(),QNetworkInterface,以及QNetworkInterface::interfaceFromName

void QHostAddress::setAddress(quint32 ip4Addr)

设置由ip4Addr指定的IPv4地址。

void QHostAddress::setAddress(const quint8 *ip6Addr)

这是一个重载函数。

设置由ip6Addr指定的IPv6地址。

ip6Addr必须是一个以网络字节顺序(高字节在前)排列的16字节数组。

void QHostAddress::setAddress(const Q_IPV6ADDR &ip6Addr)

这是一个重载函数。

设置由ip6Addr指定的IPv6地址。

void QHostAddress::setAddress(const sockaddr *sockaddr)

这是一个重载函数。

根据本地结构sockaddr设置IPv4或IPv6地址。如果地址解析成功,则返回true并设置地址;否则返回false

bool QHostAddress::setAddress(const QString &address)

这是一个重载函数。

根据字符串表示形式指定的address设置IPv4或IPv6地址(例如,“127.0.0.1”)。如果地址解析成功,则返回true并设置地址;否则返回false

void QHostAddress::setAddress(QHostAddress::SpecialAddress address)

这是一个重载函数。

设置address指定的特殊地址。

void QHostAddress::setScopeId(const QString &id)

将地址的IPv6范围ID设置为id。如果地址协议不是IPv6,此函数不执行任何操作。范围ID可以设置为接口名称(如“eth0”或“en1”)或表示接口索引的整数。如果id是接口名称,QtNetwork将在调用操作系统网络功能之前使用QNetworkInterface::interfaceIndexFromName()将之转换为接口索引。

另请参阅scopeIdQNetworkInterface,以及QNetworkInterface::interfaceFromName

[noexcept] void QHostAddress::swap(QHostAddress &other)

交换此主机地址与other。此操作很快,而且永远不会失败。

quint32 QHostAddress::toIPv4Address(bool *ok = nullptr) const

将IPv4地址转换为数字。

例如,如果地址是127.0.0.1,则返回的值是2130706433(即0x7f000001)。

如果protocol()是IPv4Protocol,或者如果协议是IPv6Protocol,并且IPv6地址是IPv4映射地址(RFC4291),则此值有效。在这些情况下,ok将设置为true。否则,它将设置为false。

另请参阅 toString

Q_IPV6ADDR QHostAddress::toIPv6Address() const

将IPv6地址作为Q_IPV6ADDR结构返回。该结构由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

QString QHostAddress::toString() const

将地址作为字符串返回。

例如,如果地址是IPv4地址127.0.0.1,则返回的字符串是"127.0.0.1"。对于IPv6,字符串格式将遵循RFC5952建议。对于QHostAddress::Any,其IPv4地址将被返回("0.0.0.0")

另请参阅 toIPv4Address

bool QHostAddress::operator!=(const QHostAddress &other) const

如果此主机地址不等于给定的other地址,则返回true;否则返回false

bool QHostAddress::operator!=(QHostAddress::SpecialAddress other) const

如果此主机地址不等于给定的other地址,则返回true;否则返回false

QHostAddress &QHostAddress::operator=(const QHostAddress &address)

将另一个主机address赋给此对象,并返回对此对象的引用。

QHostAddress &QHostAddress::operator=(QHostAddress::SpecialAddress address)

将特殊地址address赋给此对象,并返回对此对象的引用。

另请参阅 setAddress

bool QHostAddress::operator==(const QHostAddress &other) const

如果此主机地址与提供的其他地址相同,则返回 true;否则返回 false。此运算符仅调用 isEqual(other, StrictConversion)。

另请参阅isEqual()。

bool QHostAddress::operator==(QHostAddress::SpecialAddress other) const

如果此主机地址与给定的 other 地址相同,则返回 true,否则返回 false

相关非成员函数

[noexcept] size_t qHash(const QHostAddress &key, size_t seed = 0)

返回主机地址 key 的哈希值,使用 seed 来播种计算。

bool operator!=(QHostAddress::SpecialAddress lhs, const QHostAddress &rhs)

如果特殊地址 lhs 与主机地址 rhs 相同,则返回 false;否则返回 true

另请参阅isEqual()。

QDataStream &operator<<(QDataStream &out, const QHostAddress &address)

将主机地址 address 写入流 out 并返回流的引用。

另请参阅序列化 Qt 数据类型

bool operator==(QHostAddress::SpecialAddress lhs, const QHostAddress &rhs)

如果特殊地址 lhs 与主机地址 rhs 相同,则返回 true;否则返回 false

另请参阅isEqual()。

QDataStream &operator>>(QDataStream &in, QHostAddress &address)

从流 in 中读取主机地址到 address,并返回流的引用。

另请参阅序列化 Qt 数据类型

© 2024 The Qt Company Ltd. 本文档中包含的贡献的文档版权属于各自的拥有者。本提供的文档是根据 Free Software Foundation 发布的 GNU Free Documentation License 版本 1.3 的条款许可的。Qt 及其相关标志是芬兰及全球其他地区的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。