gpt4 book ai didi

c++ - 验证/识别字符串表示的 IP 地址的版本

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:29 25 4
gpt4 key购买 nike

是否有一种聪明/巧妙的方法来分析表示 IP 地址的字符串是否有效并识别其版本,以便能够仅通过使用 UNIX API 将其转换为适当的结构?

我不想使用正则表达式,不需要为此添加对其他库的依赖。


我的第一个方法是:

in_addr addr;
memset( &addr, 0, sizeof( in_addr ) );
// try to convert from standard numbers-and-dots notation into binary data
if( 0 != inet_aton( sIPAddress.c_str(), &addr ) )
{
return Socket::enIPv4; // valid IPv4
}

in6_addr addr6;
memset( &addr6, 0, sizeof( in6_addr ) );
if( inet_pton( AF_INET6, sIPAddress.c_str(), &addr6 ) > 0 )
{
return Socket::enIPv6; // valid IPv6
}

return Socket::enUnknown;

这里的问题是,如果我传递像 1 这样的字符串,它会成功转换为 IPv4。类似 11111 的字符串也被转换为 IPv4。通过文档:

inet_aton() returns non-zero if the address is valid, zero if not.

显然,此函数不仅可以识别 XXX.XXX.XXX.XXX 格式,而且可以在内部执行更多操作。

当然,我可以通过分析字符串来编写自己的函数(实际上这会很有趣),但我想改用已经存在且经过测试的函数。有可能还是我应该自己写?

最佳答案

根据 manual page"a""a.b""a.b.c" 等字符串都是 inet_aton 的有效地址。如果您只想要“普通”点分十进制,也可以对这些地址使用 inet_pton

关于c++ - 验证/识别字符串表示的 IP 地址的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8212830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com