我的文本文件包含许多(数百万)IP4和IP6地址。我需要尽快阅读所有这些内容。
我知道inet_pton
但我不知道地址是IP4还是IP6所以我需要做“尝试和错误”的方法,我尝试IP4,如果失败,请尝试IP6。但是我不喜欢这个解决方案,因为当它是IP6时,我会不必要地解析IP4。
答案 0 :(得分:0)
我认为您需要做的就是解析当前行中的字符,直到您点击非十进制数字(因为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,因为它用于错误报告。这可能需要调整。