我不需要验证IP地址是否可访问或类似的东西.我只想验证字符串是否为dotted-quad(xxx.xxx.xxx.xxx)IPv4格式,其中xxx介于0和255之间.
您可能需要inet_pton,它返回-1表示无效的AF参数,0表示无效地址,+1表示有效IP地址.它支持IPv4和未来的IPv6地址.如果您仍需要编写自己的IP地址处理,请记住标准的32位十六进制数是有效的IP地址.并非所有IPv4地址都采用点分十进制表示法.
此函数既可以验证地址,也可以在相关的套接字调用中使用相同的地址.
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;
这也适用于十六进制和八进制四边形.这也是一种更便携的解决方案.
我解决的解决方案是:
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地址,但这对我的应用程序来说是可接受的.
这看起来很简单,但有一些陷阱.例如,在前面的答案中发布的许多解决方案假设四边形在基数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.10
as 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
这是一种简单明了的方法.
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; }
如果你在Windows上,你可以使用WSAStringToAddress
并基于我们知道的返回值,如果传递的参数是有效的IP.这支持从Windows 2000开始的IPv4和IPv6.