0

我有许多(数百万)IP4 和 IP6 地址的文本文件。我需要尽快阅读所有这些。

我知道inet_pton但我不知道地址是 IP4 还是 IP6,所以我需要在尝试 IP4 的地方执行“尝试和错误”方法,如果失败,请尝试 IP6。但我不喜欢这个解决方案,因为当它是 IP6 时,我会不必要地解析 IP4。

4

1 回答 1

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,因为它用于错误报告。这可能需要调整。

于 2013-04-10T09:36:04.413 回答