本页内容

QHostAddress Class

QHostAddress 类提供了一个 IP 地址。更多内容...

头文件: #include <QHostAddress>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network

公共类型

flags ConversionMode
enum ConversionModeFlag { StrictConversion, ConvertV4MappedToIPv4, ConvertV4CompatToIPv4, ConvertLocalHost, ConvertUnspecifiedAddress, TolerantConversion }
enum SpecialAddress { Null, LocalHost, LocalHostIPv6, Broadcast, AnyIPv4, …, Any }

公共函数

QHostAddress()
QHostAddress(QHostAddress::SpecialAddress address)
QHostAddress(const QString &address)
QHostAddress(const Q_IPV6ADDR &ip6Addr)
QHostAddress(const quint8 *ip6Addr)
QHostAddress(const sockaddr *sockaddr)
QHostAddress(quint32 ip4Addr)
QHostAddress(const QHostAddress &address)
(since 6.8) QHostAddress(QHostAddress &&other)
~QHostAddress()
void clear()
bool isBroadcast() const
bool isEqual(const QHostAddress &other, QHostAddress::ConversionMode mode = TolerantConversion) const
bool isGlobal() const
bool isInSubnet(const QHostAddress &subnet, int netmask) const
bool isInSubnet(const std::pair<QHostAddress, int> &subnet) const
bool isLinkLocal() const
bool isLoopback() const
bool isMulticast() const
bool isNull() const
(since 6.6) bool isPrivateUse() const
bool isSiteLocal() const
bool isUniqueLocalUnicast() const
int protocol() const
QString scopeId() const
void setAddress(quint32 ip4Addr)
void setAddress(QHostAddress::SpecialAddress address)
bool setAddress(const QString &address)
void setAddress(const Q_IPV6ADDR &ip6Addr)
void setAddress(const quint8 *ip6Addr)
void setAddress(const sockaddr *sockaddr)
void setScopeId(const QString &id)
void swap(QHostAddress &other)
quint32 toIPv4Address(bool *ok = nullptr) const
Q_IPV6ADDR toIPv6Address() const
QString toString() const
bool operator!=(QHostAddress::SpecialAddress other) const
bool operator!=(const QHostAddress &other) const
QHostAddress &operator=(QHostAddress::SpecialAddress address)
QHostAddress &operator=(const QHostAddress &address)
bool operator==(QHostAddress::SpecialAddress other) const
bool operator==(const QHostAddress &other) const

静态公共成员

std::pair<QHostAddress, int> parseSubnet(const QString &subnet)
size_t qHash(const QHostAddress &key, size_t seed = 0)
bool operator!=(QHostAddress::SpecialAddress lhs, const QHostAddress &rhs)
QDataStream &operator<<(QDataStream &out, const QHostAddress &address)
bool operator==(QHostAddress::SpecialAddress lhs, const QHostAddress &rhs)
QDataStream &operator>>(QDataStream &in, QHostAddress &address)

详细说明

该类以与平台和协议无关的方式保存 IPv4 或 IPv6 地址。

QHostAddress 通常与QTcpSocket 、QTcpServer 和QUdpSocket 配合使用,用于连接主机或设置服务器。

主机地址可通过setAddress() 设置,并通过toIPv4Address()、toIPv6Address() 或toString() 获取。您可以使用protocol() 检查其类型。

注意:请 注意,QHostAddress 不执行 DNS 查询。若需进行 DNS 查询,则需要使用QHostInfo 。

该类还支持以下常见的预定义地址:Null 、LocalHost 、LocalHostIPv6 、Broadcast 以及Any 。

另请参阅 QHostInfo 、QTcpSocket 、QTcpServer 和QUdpSocket 。

成员类型文档

enum QHostAddress::ConversionModeFlag
flags QHostAddress::ConversionMode

常数值描述
QHostAddress::StrictConversion0在比较两个不同协议的QHostAddress 对象时,不要将IPv6地址转换为IPv4,这样它们将始终被视为不同。
QHostAddress::ConvertV4MappedToIPv41在比较时,将 IPv6 地址转换为 IPv4 映射地址(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 (“::ffff: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()。

enum QHostAddress::SpecialAddress

常数值描述
QHostAddress::Null0空地址对象。等同于 `QHostAddress()`。另请参阅 `QHostAddress::isNull()`。
QHostAddress::LocalHost2IPv4 本地主机地址。等同于 `QHostAddress` ("127.0.0.1")。
QHostAddress::LocalHostIPv63IPv6 本地主机地址。等同于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(QHostAddress::SpecialAddress address)

为address 构建一个 QHostAddress 对象。

[explicit] QHostAddress::QHostAddress(const QString &address)

根据字符串address 生成一个 IPv4 或 IPv6 地址(例如,“127.0.0.1”)。

另请参阅 setAddress()。

[explicit] QHostAddress::QHostAddress(const Q_IPV6ADDR &ip6Addr)

创建一个主机地址对象,其IPv6地址为ip6Addr 。

[explicit] QHostAddress::QHostAddress(const quint8 *ip6Addr)

构建一个主机地址对象,其IPv6地址为ip6Addr 。

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

[explicit] QHostAddress::QHostAddress(const sockaddr *sockaddr)

使用由原生结构sockaddr 指定的地址构建一个 IPv4 或 IPv6 地址。

另请参阅 setAddress()。

[explicit] QHostAddress::QHostAddress(quint32 ip4Addr)

创建一个主机地址对象,其IPv4地址为ip4Addr 。

QHostAddress::QHostAddress(const QHostAddress &address)

创建给定address 的副本。

[constexpr noexcept default, since 6.8] QHostAddress::QHostAddress(QHostAddress &&other)

从 `other` 移动构造一个新的 `QHostAddress`。

注意: 被移动的源对象 other 将处于一种部分形成的状态,在此状态下,唯一有效的操作是销毁和赋值。

该函数在 Qt 6.8 中引入。

[noexcept] 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 。

另请参阅 ConversionMode 和operator==()。

bool QHostAddress::isGlobal() const

如果该地址是 IPv4 或 IPv6 全局地址,则返回true ;否则返回false 。全局地址是指未被保留用于特殊用途(如环回或组播)或未来用途的地址。

请注意,IPv6 唯一本地单播地址被视为全局地址(参见isUniqueLocalUnicast()),RFC 1918 为本地网络预留的 IPv4 地址也是如此。

另请注意,IPv6 站点本地地址已被弃用,在新应用中应将其视为全局地址。此函数对站点本地地址也会返回 true。

另请参阅 isLoopback()、isSiteLocal()、isUniqueLocalUnicast() 和isPrivateUse()。

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

如果该 IP 地址位于由网络前缀subnet 和子网掩码netmask 所描述的子网中,则返回true 。

netmask 参数表示前缀长度——即用于标识地址中网络部分的起始位数。对于 IPv4,有效值范围为 0 到 32;对于 IPv6,有效值范围为 0 到 128。

如果一个 IP 地址位于某个子网的最低地址和最高地址之间,则该地址被视为属于该子网。对于 IP 版本 4,最低地址即为网络地址,而最高地址即为广播地址。

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

另请参阅 parseSubnet()。

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

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

这是一个重载函数。

bool QHostAddress::isLinkLocal() const

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

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

另请参阅 isLoopback()、isGlobal()、isMulticast()、isSiteLocal()、isUniqueLocalUnicast() 以及isPrivateUse()。

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 。

[since 6.6] bool QHostAddress::isPrivateUse() const

如果该地址是 IPv6 唯一本地单播地址或RFC 1918 规定为本地网络保留的 IPv4 地址,则返回 `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() 以及isPrivateUse()。

[static] std::pair<QHostAddress, int> QHostAddress::parseSubnet(const QString &subnet)

解析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”),无论其后是否跟有句点。 如果在此情况下子网掩码也缺失,则将其设置为实际传递的字节数(在上例中,由于有 3 个字节,因此为 24)。

另请参阅 isInSubnet()。

int QHostAddress::protocol() const

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

QString QHostAddress::scopeId() const

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

IPv6 范围标识符指定了非全局 IPv6 地址的可达性范围,从而限制了该地址可使用的区域。所有 IPv6 地址都与这样的可达性范围相关联。范围标识符用于消除那些无法保证在全球范围内唯一的地址之间的歧义。

IPv6 规定了以下四种可达性级别:

  • 节点本地:仅用于与同一接口上的服务通信的地址(例如,回环接口“::1”)。
  • 链路本地:仅限于网络接口(链路)本地的地址。主机上的每个 IPv6 接口总有一个链路本地地址。链路本地地址(“fe80...”)由本地网络适配器的 MAC 地址生成,且不保证唯一性。
  • 全局:用于全局可路由的地址,例如互联网上的公共服务器。

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

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

void QHostAddress::setAddress(quint32 ip4Addr)

将IPv4地址设置为ip4Addr 中指定的地址。

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

设置由address 指定的特殊地址。

这是一个重载函数。

bool QHostAddress::setAddress(const QString &address)

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

这是一个重载函数。

void QHostAddress::setAddress(const Q_IPV6ADDR &ip6Addr)

设置由ip6Addr 指定的IPv6地址。

这是一个重载函数。

void QHostAddress::setAddress(const quint8 *ip6Addr)

设置由 `ip6Addr` 指定的 IPv6 地址。

ip6Addr 该参数必须是一个 16 字节的数组,且采用网络字节序(高字节在前)。

这是一个重载函数。

void QHostAddress::setAddress(const sockaddr *sockaddr)

设置由原生结构sockaddr 指定的IPv4或IPv6地址。如果地址解析成功,则返回true 并设置该地址;否则返回false 。

这是一个重载函数。

void QHostAddress::setScopeId(const QString &id)

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

另请参阅 scopeId()、QNetworkInterface 和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

返回一个作为 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()。

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!=(QHostAddress::SpecialAddress other) const

如果该主机地址与给定的other 地址不一致,则返回true ;否则返回false 。

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

如果该主机地址与给定的other 地址不一致,则返回true ;否则返回false 。

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

将特殊地址address 分配给该对象,并返回该对象的引用。

另请参阅 setAddress()。

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

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

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

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

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

如果该主机地址与给定的other 地址相同,则返回true ;否则返回false 。该运算符仅调用isEqual (other,StrictConversion )。

另请参阅 isEqual()。

相关的非成员函数

[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 数据类型的序列化》。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.