我有包含许多(数百万)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,因为它用于错误报告。这可能需要调整。
关于c - 从文件读取 IP 地址的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15921971/