当前位置:  开发笔记 > 编程语言 > 正文

如何在C++中验证字符串是否为有效的IPv4地址?

如何解决《如何在C++中验证字符串是否为有效的IPv4地址?》经验,为你挑选了6个好方法。

我不需要验证IP地址是否可访问或类似的东西.我只想验证字符串是否为dotted-quad(xxx.xxx.xxx.xxx)IPv4格式,其中xxx介于0和255之间.



1> Raymond Mart..:

您可能需要inet_pton,它返回-1表示无效的AF参数,0表示无效地址,+1表示有效IP地址.它支持IPv4和未来的IPv6地址.如果您仍需要编写自己的IP地址处理,请记住标准的32位十六进制数是有效的IP地址.并非所有IPv4地址都采用点分十进制表示法.

此函数既可以验证地址,也可以在相关的套接字调用中使用相同的地址.


**警告**.根据文档,无效AF参数返回-1,无效地址返回0,有效IP地址返回+1.

2> Björn Pollex..:

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;

这也适用于十六进制和八进制四边形.这也是一种更便携的解决方案.



3> Bill the Liz..:

我解决的解决方案是:

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地址,但这对我的应用程序来说是可接受的.


这被投票了,因为...?这绝对是OP的可接受答案.:)

4> Mihai Limbăș..:

这看起来很简单,但有一些陷阱.例如,在前面的答案中发布的许多解决方案假设四边形在基数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


我知道存在陷阱,但你刚刚开辟了一整套新的蠕虫.:)
@moocha - 欢迎来到现实世界:虽然IP地址中的八进制或十六进制表示法可能有效,但不应鼓励它!实现对它的支持同样如此......
Roddy,这不是(不是)现实世界的工作方式。在现实世界中,软件健壮性被认为是非常重要的,尤其是在涉及网络时,您应该在接受的内容上尽可能宽容,在输出的内容上尽可能严格。

5> Steve..:

这是一种简单明了的方法.

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;
    }


那里有很多,或者你可以实现自己的.这是一个非常好的,你可以下载:http://www.partow.net/programming/stringtokenizer/index.html(确保您的项目可以接受许可条款)

6> 小智..:

如果你在Windows上,你可以使用WSAStringToAddress并基于我们知道的返回值,如果传递的参数是有效的IP.这支持从Windows 2000开始的IPv4和IPv6.


一个例子是有帮助的
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有