我有许多(数百万)IP4 和 IP6 地址的文本文件。我需要尽快阅读所有这些。
我知道inet_pton
但我不知道地址是 IP4 还是 IP6,所以我需要在尝试 IP4 的地方执行“尝试和错误”方法,如果失败,请尝试 IP6。但我不喜欢这个解决方案,因为当它是 IP6 时,我会不必要地解析 IP4。
我认为您需要做的就是解析当前行中的字符,直到您遇到非十进制数字(因为 IPv6 使用十六进制,而如果我们可以假设点分十进制,IPv4 通常不会)或冒号。
如果你点击一个点,你就知道该行是一个 IPv4 地址,否则它是 IPv6。
最多四个字节的额外解析应该非常快。
这是实现此分类功能的尝试:
int get_af(const char *address)
{
while(isdigit((unsigned int) *address))
++address;
if(*address == '.')
return AF_INET;
if(*address == ':' || isxdigit((unsigned int) *address))
return AF_INET6;
return -1;
}
以上假设既不是AF_INET
也不AF_INET6
是-1,因为它用于错误报告。这可能需要调整。