2017-08-04 21 views
0

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専用のソリューションは受け入れ可能です)。

答えて

0

私は本当に私自身の質問に答える憎むが、単一のコメントとしてはあまりないと6ヶ月後、自分の質問への答えがあると思われる:あなたはをカント

res_nmkquery()のような機能は、古くなっています。 DNSクエリを実行するライブラリからは、(a)システムのリゾルバ状態をロードしてDNSサーバーに手動で接続するか、(b)gethostbyname()などの機能を利用して、要求。

res_nmkquery()のような機能は、野生ではほとんど使用されないようですが、のような機能があります。これは彼らが悪いと言っているわけではありません。あなたがそれらを使用しようとしている場合には、あなたが達成しようとしていることをやるより良い方法があるでしょう。

+0

これは主に古い* BSDアプリケーションを移植するためのもので、Linuxでは古くなっています。あなたは最近 'getaddrinfo()'と友達を使うつもりです。 –

+0

@MichaelHampton:ちょっと丁寧に答えて答えを入れたら、それを選択します – cegfault

+1

(リンク先の)マニュアルページには、これらの機能が4.3BSDから来たと書かれています。この特定の古代BSDは1986年6月にリリースされました。最初のIPv6 RFCの約10年前です。 BSDは何だったのですか(https://en.wikipedia.org/wiki/History_of_the_Berkeley_Software_Distribution)、これらの関数はIPv6をサポートするように更新される機会はありません。したがって、我々は新しいAPIを持っています...これはおそらく全回答に値するものではありません.... –

関連する問題