有没有一种聪明/巧妙的方法来分析一个字符串表示的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() 返回非零值表示地址有效,返回零表示地址无效。
XXX.XXX.XXX.XXX
格式,还进行了更多内部处理。当然,我可以编写自己的函数(实际上这会很有趣),通过分析字符串来解决问题,但我想使用已经存在并经过测试的函数。这是否可能?还是我应该编写自己的函数?
inet_pton
做了同样的事情。所以,它并没有解决我的问题:\ - Kiril Kirovinet_pton
存在一个 bug,它应该只识别有效的点分十进制。 - Some programmer dudeinet_pton
是非常正确的。非常感谢,已接受并点赞。 - Kiril Kirov