多くの (数百万) の IP4 および IP6 アドレスを含むテキスト ファイルがあります。できるだけ早くそれらすべてを読む必要があります。
私は知ってinet_pton
いますが、アドレスがIP4かIP6かはわかりませんので、IP4を試して失敗した場合はIP6を試す「試行錯誤」アプローチを行う必要があります。しかし、IP6の場合、IP4を不必要に解析するため、このソリューションは好きではありません。
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
これは微調整が必要かもしれません。