Qt是否提供了一个表示IP地址的类?

Qt是否提供了一个表示IP地址的类?,qt,Qt,我以为QHostAddress就是它,但奇怪的是它没有提供验证IP地址是否有效的方法(现在,QHostAddress被弃用为Qt3) 有人知道吗?除了使用isIpv4Address()和isIPv6Address()之外,还有一种替代方法。例如: QHostAddress address(myString); if (QAbstractSocket::IPv4Protocol == address.protocol()) { qDebug("Valid IPv4 address."); }

我以为QHostAddress就是它,但奇怪的是它没有提供验证IP地址是否有效的方法(现在,QHostAddress被弃用为Qt3)


有人知道吗?

除了使用
isIpv4Address()
isIPv6Address()
之外,还有一种替代方法。例如:

QHostAddress address(myString);
if (QAbstractSocket::IPv4Protocol == address.protocol())
{
   qDebug("Valid IPv4 address.");
}
else if (QAbstractSocket::IPv6Protocol == address.protocol())
{
   qDebug("Valid IPv6 address.");
}
else
{
   qDebug("Unknown or invalid address.");
}
另见:


希望这能有所帮助。

以下是诺基亚支持工程师的官方答案,为保护隐私删除了该名称:

我在stackoverflow.com上发布了如下问题:

你可以看到有人已经发布了我问题的解决方案

然而,我想问,为什么诺基亚不只是提供一种

QHostAddress(如isValid())将检查主机地址的 有效期

谢谢你的询问。你可以 使用isNull()方法检查 有效性它将返回真实的时间 无效地址:

希望这有帮助

问候,

支持工程师,Qt开发 框架,诺基亚


QHostAddress::setAddress(const QString&address)
bool
返回值告诉您字符串是否成功解析为IPv4或IPv6地址

QHostAddress addr;
if (addr.setAddress(myString)) {
    // valid
} else {
    // invalid
}

我发现上述所有解决方案至少对于IPv4地址都不可靠。例如,使用“192”和“192.”创建
QHostAddress
。.setAddress()和
if(QAbstractSocket::IPv4Protocol==address.protocol()
都返回了
true

我发现一个更可靠的解决方案是使用
QRegularExpression
QRegularExpressionValidator
检查IP地址字符串格式

这里可以找到一个好的IPv4正则表达式示例


正如Harsha Biyani提到的,函数parseIp4Internal中有一个bug, (qtbase\src\corelib\io\qipaddress.cpp)。 IPv4地址解析不正确。 QHostAddress使用该函数解析IPv4地址

UPD。
像“1”、“1.1”这样的地址被认为是正确的地址,分别相当于“0.0.0.1”和“1.0.0.1”。

当你说“验证IP地址是否有效的方法”时,你指的是
isIPv4Address()
isIPv6Address()
方法还是其他什么?@RA,是的,你是对的。基本上,我只是想要一个接受QString的类,并告诉我QString是否是一个有效的IP地址。我以为QHostAddress就是那个,但可能不是。我相信isIPv4Address()和isIPv6Address()现在被弃用,因为它被分组在QT_3(?)我也有同样的问题,但这些答案并没有解决我的问题。例如:QHostAddress ip(“1.2”);ip.isNull();//始终为真(我想在这里为假)。对我来说已经足够好了。谢谢!奇怪的是,诺基亚不只是将此作为QHostAddress中的一种方法。我会向他们提出问题。