c - 从文件读取 IP 地址的最有效方法

标签 c linux ip

我有包含许多(数百万)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_INETAF_INET6 都不为 -1,因为它用于错误报告。这可能需要调整。

关于c - 从文件读取 IP 地址的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15921971/

相关文章:

ios - 在具有格式的字符串上崩溃 EXC_BAD_ACCESS

c# - 自动获取服务器IP给客户端

python - 将 C 结构传递给 Python 函数

c - 如何将两个数组组合成一个交替元素?

linux - Fedora 24(64 位)Git 安装(perl-devel、ParseXs 安装)

c - 守护进程无法在挂起后存活

iis - 拒绝从 RFC1918 IP 到公共(public)服务器地址的请求

c - 解决 `./recover' : free(): invalid next size (normal): 0x0000000001ddd270 *** Aborted in c 中的错误

c - 难以理解 fork() 和进程树

c - 如何使用 lstat() 来确定是否有硬链接(hard link)