-1

正規化された IP アドレスを使用してデータベースにデータを保存したいと考えています。

この時点で、ソフトウェアは IPv4 または IPv6 アドレスを取得できます。すべてのアドレスを IPv6 アドレスに変換して正規化したいと考えています。

inet_pton()文字列をバイナリアドレスに変換することを知っています。したがって、IPv6 で 1 回試行できます。失敗した場合は、IPv4 で再試行します。

struct sockaddr_in6 sa;
int r = inet_pton(AF_INET6, input_addr, &sa.sin6_addr);
if(r != 1)
{
    // try again with IPv4
    struct sockaddr_in sa4;
    int r = inet_pton(AF_INET, input_addr, &sa4.sin_addr);

    // is there such a function?!
    inet_convert_ipv4_to_ipv6(&sa4, &sa);
}
char output_addr[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, &sa, output_addr, sizeof(output_addr));

// in C++, I can do that if function returns std::string
// in C you cannot return a pointer on the stack, watch out!
return output_addr;

inet_convert_ipv4_to_ipv6(&sa4, &sa);そこで、 をに変換するsockaddr_inような関数を探していsockaddr_in6ます。Cライブラリにそのようなものはありますか?

そのような関数がない場合、次のように '::ffff:' イントロデューサを使用することで解決できます。

// try again with IPv4
std::string ipv4_to_ipv6("::ffff:");
ipv4_to_ipv6 += input_addr;
int r = inet_pton(AF_INET6, ipv4_to_ipv6.c_str(), &sa.sin_addr);

sockaddr_in代わりに、IPv4を IPv6sockaddr_in6関数に変換する方法があることを願っています。もっときれいになると思います...この最後のコードは100%安全ではないと思います(最初にIPv4変換をテストし、成功した場合はIPv6変換を使用して安全にすることができると思います.なんて無駄だ.時間はかかりますが!)

4

2 に答える 2