我不需要验证IP地址是否可达或任何其他类似的内容。 我只想验证字符串是否采用了点分十进制(xxx.xxx.xxx.xxx)IPv4格式,其中xxx介于0和255之间。
Boost.Asio提供了类ip::address。 如果你只想验证字符串,可以像这样使用它:
std::string ipAddress = "127.0.0.1";
boost::system::error_code ec;
boost::asio::ip::address::from_string( ipAddress, ec );
if ( ec )
std::cerr << ec.message( ) << std::endl;
这个方法同样适用于十六进制和八进制的四元组。而且这也是一个更加便携的解决方案。
is_v4()
方法,以确保它不是IPv6地址。此外,似乎现在它只支持四个十进制点的精确表示。已经使用Boost 1.73和1.54进行了检查。 - Alex Che我选择的解决方案是:
#include <arpa/inet.h>
// ...
bool Config::validateIpAddress(const string &ipAddress)
{
struct sockaddr_in sa;
int result = inet_pton(AF_INET, ipAddress.c_str(), &(sa.sin_addr));
return result != 0;
}
这对其他回答中提到的大多数情况都有效。 它不能识别使用八进制或十六进制格式的IP地址,但这对我的应用程序来说是可以接受的。
result != 1
。请参阅 http://pubs.opengroup.org/onlinepubs/009695399/functions/inet_ntop.html。 - Martin Bonner supports Monica192.168.1.010
不是 192.168.1.10
,而实际上是 192.168.1.8
,而且IP地址 192.168.019.14
是无效的,因为第三个四元组包含无效的8进制数字9。
我强烈鼓励您使用操作系统或编译器环境中提供的socket库中提供的函数。
编辑:(尽管这可能是隐含的)当然,您也可以有16进制四元组,比如192.168.1.0x0A
表示192.168.1.10,当然您可以任意混合使用大写和小写字母,比如0xC0.0xa8.1.010
表示192.168.1.8。如果您想玩得开心,请使用ping测试一些例子。这在跨平台上完全正常工作(在Linux、NetBSD和Win32上测试过)。
针对KaluSingh Gabbar的请求进行进一步编辑:例如,您可以将192.168.1.10
指定为0xc0a8010a
,它仍然表示一个有效的IP地址,例如:
[mihailim@home ~]$ ping 0xc0a8010a
PING 0xc0a8010a (192.168.1.10) 56(84) bytes of data.
^C
--- 0xc0a8010a ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2479ms
bool IsIPAddress(std::string & ipaddr)
{
StringTokenizer quads(ipaddr,".");
if (quads.countTokens() != 4) return false;
for (int i=0; i < 4; i++)
{
std::string quad = quads.nextToken();
for (int j=0; j < quad.length(); j++
if (!isdigit(quad[j])) return false;
int quad = atoi(quads.GetTokenAt(i));
if (quad < 0) || (quad > 255)) return false;
}
return true;
}
您可以编写自己的函数,如下所示:
bool isValidIPv4(const char *IPAddress)
{
unsigned char a,b,c,d;
return sscanf(IPAddress,"%d.%d.%d.%d", &a, &b, &c, &d) == 4;
}
sscanf()
和sprintf()
在某些情况下非常有用。:))
WSAStringToAddress
函数,根据返回值我们可以知道传入的参数是否为有效的IP地址。从Windows 2000开始,该函数支持IPv4和IPv6。我已经使用仅限于C标准库函数完成了相同的操作,虽然它不支持如上所述的八进制四元组,但这不应该是问题,我可以轻松添加那一部分并将其提供给您。作为一个初学者(学生),直到现在我才知道在您的ip地址中可能会有一个八进制数。我以为它必须是十进制。
Boost.Regex 是一个合适的选择。
bool validate_ip_address(const std::string& s)
{
static const boost::regex e("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
return regex_match(s, e);
}
inet_pton()
实际上只接受点分十进制表示法。 - Alex Che