0

多くの (数百万) の IP4 および IP6 アドレスを含むテキスト ファイルがあります。できるだけ早くそれらすべてを読む必要があります。

私は知ってinet_ptonいますが、アドレスがIP4かIP6かはわかりませんので、IP4を試して失敗した場合はIP6を試す「試行錯誤」アプローチを行う必要があります。しかし、IP6の場合、IP4を不必要に解析するため、このソリューションは好きではありません。

4

1 に答える 1

0

10 進数以外の数字 (IPv6 は 16 進数を使用するため、ドット付き 10 進数を想定できる場合は IPv4 は通常使用しないため) またはコロンのいずれかに到達するまで、現在の行から文字を解析するだけでよいと思います。

代わりにドットを打った場合、その行は IPv4 アドレスであり、そうでない場合は IPv6 であることがわかります。

最大 4 バイトの余分な解析は非常に高速です。

この分類関数を実装する試みは次のとおりです。

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;
}

上記は、エラー報告に使用されるため、-1AF_INETも -1 でもないことを前提としています。AF_INET6これは微調整が必​​要かもしれません。

于 2013-04-10T09:36:04.413 に答える