我不需要验证IP地址是否可访问或类似的东西.我只想验证字符串是否为dotted-quad(xxx.xxx.xxx.xxx)IPv4格式,其中xxx介于0和255之间.
Bjö*_*lex 47
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;
Run Code Online (Sandbox Code Playgroud)
这也适用于十六进制和八进制四边形.这也是一种更便携的解决方案.
Bil*_*ard 36
我解决的解决方案是:
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;
}
Run Code Online (Sandbox Code Playgroud)
这适用于其他答案中提到的大多数情况.它无法识别具有八进制或十六进制格式的IP地址,但这对我的应用程序来说是可接受的.
Mih*_*șan 17
这看起来很简单,但有一些陷阱.例如,在前面的答案中发布的许多解决方案假设四边形在基数10中 - 但是以零开始的四边形必须被视为基数8(八进制)数,因此例如任何以零开始的四边形部分包含数字8或9无效.即IP号192.168.1.010是不是 192.168.1.10,但现实是192.168.1.8,和IP号码192.168.019.14,因为第三个四倍包含无效基地8位9无效.
我强烈建议您使用操作系统或编译器环境中包含的套接字库提供的功能.
编辑:(认为它是隐含的,但是)当然,你也可以有十六进制四边形,一个la 192.168.1.0x0A为192.168.1.10,当然你可以使用大写和小写快乐地混合和匹配你的虐待狂内容,一个la 0xC0.0xa8.1.010为192.168 .1.8.如果你想玩得开心,请尝试使用ping的一些例子.这可以很好地跨平台工作(在Linux,NetBSD和Win32下发誓的同时测试了一段时间.)
进一步编辑以响应KaluSingh Gabbar的请求:例如,您可以指定192.168.1.10as 0xc0a8010a并且它仍然代表有效的IP号码,la:
[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
Run Code Online (Sandbox Code Playgroud)
这是一种简单明了的方法.
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;
}
Run Code Online (Sandbox Code Playgroud)
小智 7
您可以像这样编写自己的函数:
bool isValidIPv4(const char *IPAddress)
{
unsigned char a,b,c,d;
return sscanf(IPAddress,"%d.%d.%d.%d", &a, &b, &c, &d) == 4;
}
Run Code Online (Sandbox Code Playgroud)
sscanf()并且sprintf()在某些情况下非常有用。:))
小智 5
如果你在Windows上,你可以使用WSAStringToAddress并基于我们知道的返回值,如果传递的参数是有效的IP.这支持从Windows 2000开始的IPv4和IPv6.