151 if ((a & 0xff000000U) == 0x7f000000U)
152 return LoopbackAddress;
153 if ((a & 0xf0000000U) == 0xe0000000U)
154 return MulticastAddress;
155 if ((a & 0xffff0000U) == 0xa9fe0000U)
156 return LinkLocalAddress;
157 if ((a & 0xff000000U) == 0)
158 return LocalNetAddress;
159 if ((a & 0xf0000000U) == 0xf0000000U) {
160 if (a == 0xffffffffU)
161 return BroadcastAddress;
162 return UnknownAddress;
164 if (((a & 0xff000000U) == 0x0a000000U)
165 || ((a & 0xfff00000U) == 0xac100000U)
166 || ((a & 0xffff0000U) == 0xc0a80000U))
167 return PrivateNetworkAddress;
171 return GlobalAddress;
177 quint32 high16 = qFromBigEndian(a6_32.c[0]) >> 16;
178 switch (high16 >> 8) {
180 return MulticastAddress;
182 switch (high16 & 0xffc0) {
184 return SiteLocalAddress;
187 return LinkLocalAddress;
190 return UnknownAddress;
194 return UniqueLocalAddress;
196 return GlobalAddress;
200 quint64 low64 = qFromBigEndian(a6_64.c[1]);
202 return LoopbackAddress;
203 if (low64 >> 32 == 0xffff) {
204 Q_ASSERT(quint32(low64) == 0);
205 return LocalNetAddress;
208 return GlobalAddress;
210 if (protocol == QHostAddress::UnknownNetworkLayerProtocol)
211 return UnknownAddress;
214 return LocalNetAddress;
219 static const quint8 zeroes[16] = { 0 };
230 if (address.protocol() == QHostAddress::IPv4Protocol) {
231 ip.v4 = qToBigEndian(address.toIPv4Address());
233 }
else if (address.protocol() == QHostAddress::IPv6Protocol) {
234 memcpy(ip.v6, address.toIPv6Address().c, 16);
278 if (ptr < end && memcmp(ptr + 1, zeroes, end - ptr - 1) != 0)
287 Q_ASSERT(end == 32 || end == 128);
292 quint8 bytemask = 256 - (1 << (8 - (start & 7)));
293 where[start / 8] &= bytemask;
296 memset(where + (start + 7) / 8, 0, end / 8 - (start + 7) / 8);
301 if (length == 255 || protocol == QHostAddress::AnyIPProtocol ||
302 protocol == QHostAddress::UnknownNetworkLayerProtocol) {
303 return QHostAddress();
304 }
else if (protocol == QHostAddress::IPv4Protocol) {
308 else if (length == 32)
309 a = quint32(0xffffffff);
311 a = quint32(0xffffffff) >> (32 - length) << (32 - length);
312 return QHostAddress(a);
315 memset(a6.c, 0xFF,
sizeof(a6));
316 clearBits(a6.c, length, 128);
317 return QHostAddress(a6);
657quint32 QHostAddress::toIPv4Address(
bool *ok)
const
661 *ok = d->protocol == QHostAddress::IPv4Protocol || d->protocol == QHostAddress::AnyIPProtocol
662 || (d->protocol == QHostAddress::IPv6Protocol
663 && convertToIpv4(dummy, d->a6, ConversionMode(QHostAddress::ConvertV4MappedToIPv4
664 | QHostAddress::ConvertUnspecifiedAddress)));
705QString QHostAddress::toString()
const
708 if (d->protocol == QHostAddress::IPv4Protocol
709 || d->protocol == QHostAddress::AnyIPProtocol) {
710 quint32 i = toIPv4Address();
711 QIPAddressUtils::toString(s, i);
712 }
else if (d->protocol == QHostAddress::IPv6Protocol) {
713 QIPAddressUtils::toString(s, d->a6.c);
714 if (!d->scopeId.isEmpty())
715 s += u'%' + d->scopeId;
803bool QHostAddress::isEqual(
const QHostAddress &other, ConversionMode mode)
const
808 if (d->protocol == QHostAddress::IPv4Protocol) {
809 switch (other.d->protocol) {
810 case QHostAddress::IPv4Protocol:
811 return d->a == other.d->a;
812 case QHostAddress::IPv6Protocol:
814 return convertToIpv4(a4, other.d->a6, mode) && (a4 == d->a);
815 case QHostAddress::AnyIPProtocol:
816 return (mode & QHostAddress::ConvertUnspecifiedAddress) && d->a == 0;
817 case QHostAddress::UnknownNetworkLayerProtocol:
822 if (d->protocol == QHostAddress::IPv6Protocol) {
823 switch (other.d->protocol) {
824 case QHostAddress::IPv4Protocol:
826 return convertToIpv4(a4, d->a6, mode) && (a4 == other.d->a);
827 case QHostAddress::IPv6Protocol:
828 return memcmp(&d->a6, &other.d->a6,
sizeof(Q_IPV6ADDR)) == 0;
829 case QHostAddress::AnyIPProtocol:
830 return (mode & QHostAddress::ConvertUnspecifiedAddress)
831 && (d->a6_64.c[0] == 0) && (d->a6_64.c[1] == 0);
832 case QHostAddress::UnknownNetworkLayerProtocol:
837 if ((d->protocol == QHostAddress::AnyIPProtocol)
838 && (mode & QHostAddress::ConvertUnspecifiedAddress)) {
839 switch (other.d->protocol) {
840 case QHostAddress::IPv4Protocol:
841 return other.d->a == 0;
842 case QHostAddress::IPv6Protocol:
843 return (other.d->a6_64.c[0] == 0) && (other.d->a6_64.c[1] == 0);
849 return d->protocol == other.d->protocol;
856bool QHostAddress::operator ==(SpecialAddress other)
const
858 quint32 ip4 = INADDR_ANY;
861 return d->protocol == QHostAddress::UnknownNetworkLayerProtocol;
864 ip4 = INADDR_BROADCAST;
868 ip4 = INADDR_LOOPBACK;
872 return d->protocol == QHostAddress::AnyIPProtocol;
879 if (d->protocol == QHostAddress::IPv6Protocol) {
880 quint64 second = quint8(other == LocalHostIPv6);
881 return d->a6_64.c[0] == 0 && d->a6_64.c[1] == qToBigEndian(second);
887 return d->protocol == QHostAddress::IPv4Protocol && d->a == ip4;
925bool QHostAddress::isInSubnet(
const QHostAddress &subnet,
int netmask)
const
927 if (subnet.protocol() != d->protocol || netmask < 0)
936 if (d->protocol == QHostAddress::IPv4Protocol) {
939 ip4.ip = qToBigEndian(d->a);
940 net4.ip = qToBigEndian(subnet.d->a);
943 }
else if (d->protocol == QHostAddress::IPv6Protocol) {
947 net = subnet.d->a6.c;
952 if (netmask >= 8 && memcmp(ip, net, netmask / 8) != 0)
954 if ((netmask & 7) == 0)
958 quint8 bytemask = 256 - (1 << (8 - (netmask & 7)));
959 quint8 ipbyte = ip[netmask / 8];
960 quint8 netbyte = net[netmask / 8];
961 return (ipbyte & bytemask) == (netbyte & bytemask);
1003std::pair<QHostAddress,
int> QHostAddress::parseSubnet(
const QString &subnet)
1020 const std::pair<QHostAddress,
int> invalid = std::pair(QHostAddress(), -1);
1021 if (subnet.isEmpty())
1024 qsizetype slash = subnet.indexOf(u'/');
1025 QStringView netStr(subnet);
1027 netStr.truncate(slash);
1030 bool isIpv6 = netStr.contains(u':');
1034 if (!isIpv6 && subnet.indexOf(u'.', slash + 1) != -1) {
1038 if (!mask.setAddress(subnet.mid(slash + 1)))
1040 if (!parser.setAddress(mask))
1042 netmask = parser.prefixLength();
1045 netmask = QStringView{subnet}.mid(slash + 1).toUInt(&ok);
1059 if (!net.setAddress(netStr.toString()))
1062 clearBits(net.d->a6.c, netmask, 128);
1063 return std::pair(net, netmask);
1070 auto parts = netStr.split(u'.');
1071 if (parts.isEmpty() || parts.size() > 4)
1074 if (parts.constLast().isEmpty())
1078 for (
int i = 0; i < parts.size(); ++i) {
1080 uint byteValue = parts.at(i).toUInt(&ok);
1081 if (!ok || byteValue > 255)
1087 addr <<= 8 * (4 - parts.size());
1088 if (netmask == -1) {
1089 netmask = 8 * parts.size();
1090 }
else if (netmask == 0) {
1095 }
else if (netmask != 32) {
1097 quint32 mask = quint32(0xffffffff) >> (32 - netmask) << (32 - netmask);
1101 return std::pair(QHostAddress(addr), netmask);