res_ninit()、res_nmkquery()などのlinux resolver functionsを使用してDNSリクエストを実行しています。res_nmkquery()を使用してipv6専用DNSサーバに接続する
ほとんどの場合、システムのデフォルトリゾルバを使用するのは大丈夫ですが、特定のホストまたはIPアドレスでライブDNS要求を手動で実行する必要がある場合があります。
これはどこに問題があるのですか?IPv6トラフィックだけを受け入れるホストで動作しているDNSサーバーに接続することができますが、特定のネームサーバーに接続するコードには通常、次のようなものが含まれます。
int i, c;
uint32_t ip;
struct __res_state state;
// a bunch of other stuff
res_ninit(&state);
// more stuff
memcpy((void *)&state.nsaddr_list[0].sin_addr, &ip, sizeof(ip));
// more stuff with state
res_nmkquery(&state, /* ... blah blah */);
// and so on... you get the idea
このコードは明らかにのみ、またIPv4のみの値を処理struct sockaddr_in
変数であり、{} __res_state .ns_addr_list構造、へのuint32_t値のコピー(IPv4のアドレスをとる。
をUSR /を見てみます/include/resolv.h、__res_state構造体にも変数があることがわかりますu_int16_t nscount6;
とstruct sockaddr_in6 *nsaddrs[MAXNS];
がありますが、これは明らかにipv6をサポートしています。しかし、res_nmkquery()呼び出しでこれらの値を使用してipv6専用ホスト上のDNSサーバーに接続することについては、私はinterwebsのコメントを見つけることができません。
したがって、ipv6専用ホストのDNSサーバーに接続するにはres_nmkquery()および/またはstruct __res_stateを使用するにはどうすればいいですか?
私はすでにnsaddrsとnscount6変数を直接編集しようとしましたが、res_nmkquery()へのコードではエラーが返され、そこに置かれたネームサーバーは表示されません。私はこの仕事をするために何をする必要がありますか?
違いがある場合、私はubuntuだけを気にします(つまり、gcc専用のソリューションまたはgnu専用のソリューションは受け入れ可能です)。
これは主に古い* BSDアプリケーションを移植するためのもので、Linuxでは古くなっています。あなたは最近 'getaddrinfo()'と友達を使うつもりです。 –
@MichaelHampton:ちょっと丁寧に答えて答えを入れたら、それを選択します – cegfault
(リンク先の)マニュアルページには、これらの機能が4.3BSDから来たと書かれています。この特定の古代BSDは1986年6月にリリースされました。最初のIPv6 RFCの約10年前です。 BSDは何だったのですか(https://en.wikipedia.org/wiki/History_of_the_Berkeley_Software_Distribution)、これらの関数はIPv6をサポートするように更新される機会はありません。したがって、我々は新しいAPIを持っています...これはおそらく全回答に値するものではありません.... –