Qt:QHostAddress学习

1059 篇文章 286 订阅

QHostAddress 

功能:

  • QHostAddress类提供了一个IP地址信息。这个类可以提供与平台无关的,支持IPv4和IPv6的IP地址信息。
  • QHostAddress通常都与QTcpSocket, QTcpServer和QUdpSocket一起配合使用,它可以用来辅助连接一个主机,或者辅助启动一个服务器。
  • setAddress()可以指定QHostAdress的IP地址。toIPv4Address(), toIPv6Address(), 或者toString()可以获取IP地址值。protocol()可以用来检查协议的类型。
  • 注意:QHostAddress不用于DNS查找,QHostInfo可以用于DNS查找。
  • 该类还支持常见的预定义地址:NullLocalHostLocalHostIPv6BroadcastAny
  • 另请参见QHostInfoQTcpSocketQTcpServerQUdpSocket
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()。
ConstantValue描述
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所有未指定的地址将比较相等,即AnyIPv4AnyIPv6和Any。
QHostAddress::TolerantConversion0xff设置所有前面的三个标志。

SpecialAddress

原型:

enum QHostAddress::SpecialAddress

功能:

 

ConstantValue描述
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::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()

功能:

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中引入的。

  • 另请参见ConversionModeoperator ==()。

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

功能:

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地址和子网掩码之间用“/”分隔。
  • 这个函数支持如下形式的参数:

  1. 123.123.123.123/n,其中n是0到32之间的任意值

  2. 23.123.123.123/255.255.255.255

  3. <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(),QNetworkInterfaceQNetworkInterface :: 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)

功能:

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]
}

 

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

 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值