156 if ((a & 0xff000000U) == 0x7f000000U)
157 return LoopbackAddress;
158 if ((a & 0xf0000000U) == 0xe0000000U)
159 return MulticastAddress;
160 if ((a & 0xffff0000U) == 0xa9fe0000U)
161 return LinkLocalAddress;
162 if ((a & 0xff000000U) == 0)
163 return LocalNetAddress;
164 if ((a & 0xf0000000U) == 0xf0000000U) {
165 if (a == 0xffffffffU)
166 return BroadcastAddress;
167 return UnknownAddress;
169 if (((a & 0xff000000U) == 0x0a000000U)
170 || ((a & 0xfff00000U) == 0xac100000U)
171 || ((a & 0xffff0000U) == 0xc0a80000U))
172 return PrivateNetworkAddress;
176 return GlobalAddress;
182 quint32 high16 = qFromBigEndian(a6_32.c[0]) >> 16;
183 switch (high16 >> 8) {
185 return MulticastAddress;
187 switch (high16 & 0xffc0) {
189 return SiteLocalAddress;
192 return LinkLocalAddress;
195 return UnknownAddress;
199 return UniqueLocalAddress;
201 return GlobalAddress;
205 quint64 low64 = qFromBigEndian(a6_64.c[1]);
207 return LoopbackAddress;
208 if (low64 >> 32 == 0xffff) {
209 Q_ASSERT(quint32(low64) == 0);
210 return LocalNetAddress;
213 return GlobalAddress;
215 if (protocol == QHostAddress::UnknownNetworkLayerProtocol)
216 return UnknownAddress;
219 return LocalNetAddress;
224 static const quint8 zeroes[16] = { 0 };
235 if (address.protocol() == QHostAddress::IPv4Protocol) {
236 ip.v4 = qToBigEndian(address.toIPv4Address());
238 }
else if (address.protocol() == QHostAddress::IPv6Protocol) {
239 memcpy(ip.v6, address.toIPv6Address().c, 16);
283 if (ptr < end && memcmp(ptr + 1, zeroes, end - ptr - 1) != 0)
292 Q_ASSERT(end == 32 || end == 128);
297 quint8 bytemask = 256 - (1 << (8 - (start & 7)));
298 where[start / 8] &= bytemask;
301 memset(where + (start + 7) / 8, 0, end / 8 - (start + 7) / 8);
306 if (length == 255 || protocol == QHostAddress::AnyIPProtocol ||
307 protocol == QHostAddress::UnknownNetworkLayerProtocol) {
308 return QHostAddress();
309 }
else if (protocol == QHostAddress::IPv4Protocol) {
313 else if (length == 32)
314 a = quint32(0xffffffff);
316 a = quint32(0xffffffff) >> (32 - length) << (32 - length);
317 return QHostAddress(a);
320 memset(a6.c, 0xFF,
sizeof(a6));
321 clearBits(a6.c, length, 128);
322 return QHostAddress(a6);
663quint32 QHostAddress::toIPv4Address(
bool *ok)
const
667 *ok = d->protocol == QHostAddress::IPv4Protocol || d->protocol == QHostAddress::AnyIPProtocol
668 || (d->protocol == QHostAddress::IPv6Protocol
669 && convertToIpv4(dummy, d->a6, ConversionMode(QHostAddress::ConvertV4MappedToIPv4
670 | QHostAddress::ConvertUnspecifiedAddress)));
711QString QHostAddress::toString()
const
714 if (d->protocol == QHostAddress::IPv4Protocol
715 || d->protocol == QHostAddress::AnyIPProtocol) {
716 quint32 i = toIPv4Address();
717 QIPAddressUtils::toString(s, i);
718 }
else if (d->protocol == QHostAddress::IPv6Protocol) {
719 QIPAddressUtils::toString(s, d->a6.c);
720 if (!d->scopeId.isEmpty())
721 s += u'%' + d->scopeId;
809bool QHostAddress::isEqual(
const QHostAddress &other, ConversionMode mode)
const
814 if (d->protocol == QHostAddress::IPv4Protocol) {
815 switch (other.d->protocol) {
816 case QHostAddress::IPv4Protocol:
817 return d->a == other.d->a;
818 case QHostAddress::IPv6Protocol:
820 return convertToIpv4(a4, other.d->a6, mode) && (a4 == d->a);
821 case QHostAddress::AnyIPProtocol:
822 return (mode & QHostAddress::ConvertUnspecifiedAddress) && d->a == 0;
823 case QHostAddress::UnknownNetworkLayerProtocol:
828 if (d->protocol == QHostAddress::IPv6Protocol) {
829 switch (other.d->protocol) {
830 case QHostAddress::IPv4Protocol:
832 return convertToIpv4(a4, d->a6, mode) && (a4 == other.d->a);
833 case QHostAddress::IPv6Protocol:
834 return memcmp(&d->a6, &other.d->a6,
sizeof(Q_IPV6ADDR)) == 0;
835 case QHostAddress::AnyIPProtocol:
836 return (mode & QHostAddress::ConvertUnspecifiedAddress)
837 && (d->a6_64.c[0] == 0) && (d->a6_64.c[1] == 0);
838 case QHostAddress::UnknownNetworkLayerProtocol:
843 if ((d->protocol == QHostAddress::AnyIPProtocol)
844 && (mode & QHostAddress::ConvertUnspecifiedAddress)) {
845 switch (other.d->protocol) {
846 case QHostAddress::IPv4Protocol:
847 return other.d->a == 0;
848 case QHostAddress::IPv6Protocol:
849 return (other.d->a6_64.c[0] == 0) && (other.d->a6_64.c[1] == 0);
855 return d->protocol == other.d->protocol;
862bool QHostAddress::operator ==(SpecialAddress other)
const
864 quint32 ip4 = INADDR_ANY;
867 return d->protocol == QHostAddress::UnknownNetworkLayerProtocol;
870 ip4 = INADDR_BROADCAST;
874 ip4 = INADDR_LOOPBACK;
878 return d->protocol == QHostAddress::AnyIPProtocol;
885 if (d->protocol == QHostAddress::IPv6Protocol) {
886 quint64 second = quint8(other == LocalHostIPv6);
887 return d->a6_64.c[0] == 0 && d->a6_64.c[1] == qToBigEndian(second);
893 return d->protocol == QHostAddress::IPv4Protocol && d->a == ip4;
927bool QHostAddress::isInSubnet(
const QHostAddress &subnet,
int netmask)
const
929 if (subnet.protocol() != d->protocol || netmask < 0)
938 if (d->protocol == QHostAddress::IPv4Protocol) {
941 ip4.ip = qToBigEndian(d->a);
942 net4.ip = qToBigEndian(subnet.d->a);
945 }
else if (d->protocol == QHostAddress::IPv6Protocol) {
949 net = subnet.d->a6.c;
954 if (netmask >= 8 && memcmp(ip, net, netmask / 8) != 0)
956 if ((netmask & 7) == 0)
960 quint8 bytemask = 256 - (1 << (8 - (netmask & 7)));
961 quint8 ipbyte = ip[netmask / 8];
962 quint8 netbyte = net[netmask / 8];
963 return (ipbyte & bytemask) == (netbyte & bytemask);
1005std::pair<QHostAddress,
int> QHostAddress::parseSubnet(
const QString &subnet)
1022 const std::pair<QHostAddress,
int> invalid = std::pair(QHostAddress(), -1);
1023 if (subnet.isEmpty())
1026 qsizetype slash = subnet.indexOf(u'/');
1027 QStringView netStr(subnet);
1029 netStr.truncate(slash);
1032 bool isIpv6 = netStr.contains(u':');
1036 if (!isIpv6 && subnet.indexOf(u'.', slash + 1) != -1) {
1040 if (!mask.setAddress(subnet.mid(slash + 1)))
1042 if (!parser.setAddress(mask))
1044 netmask = parser.prefixLength();
1047 netmask = QStringView{subnet}.mid(slash + 1).toUInt(&ok);
1061 if (!net.setAddress(netStr.toString()))
1064 clearBits(net.d->a6.c, netmask, 128);
1065 return std::pair(net, netmask);
1072 auto parts = netStr.split(u'.');
1073 if (parts.isEmpty() || parts.size() > 4)
1076 if (parts.constLast().isEmpty())
1080 for (
int i = 0; i < parts.size(); ++i) {
1082 uint byteValue = parts.at(i).toUInt(&ok);
1083 if (!ok || byteValue > 255)
1089 addr <<= 8 * (4 - parts.size());
1090 if (netmask == -1) {
1091 netmask = 8 * parts.size();
1092 }
else if (netmask == 0) {
1097 }
else if (netmask != 32) {
1099 quint32 mask = quint32(0xffffffff) >> (32 - netmask) << (32 - netmask);
1103 return std::pair(QHostAddress(addr), netmask);