2016-10-28 7 views
2

URLを使用するサーバに対応するIPアドレスを取得するには、getaddrinfo()を使用します。これは基本的にDNSクエリをDNSサーバに送信します。特定の発信インターフェイスからそのクエリを送信できるようにしたい。基本的には、私はDNSクエリを送信することができる複数のインターフェイスを持っています。現在、getaddrinfo()は、DNSクエリを送信するためにどのインタフェースを使用すべきかを指示する方法を持っていません。 getaddrinfo()ルーチンを変更する唯一のオプションはありますか?誰もがこれを達成するための他の方法を知っていますか?getaddrinfoを特定のインタフェース(送信元IP)にバインド

+1

これに記載されているDNS Cライブラリのいくつかの例がありますが、あなたのプログラムコードに扱うべきである何よりもネームリゾルバとネットワークスタック(ルーティング)のより問題のようです。なぜそれは最初の問題でさえ問題になるのですか? –

答えて

0

特定のIPアドレスにアクセスするために選択されたインターフェイスは、ルーティングテーブルによって指示されます。

おそらくDNSサーバーのIPを持っているので、どのアプリケーションが要求を送信しているかにかかわらず、ルーティングテーブルがそのIPアドレス用に使用するインターフェイスによってアクセスされます。

ルーティングテーブルを変更して、特定のインターフェイスでトラフィックを強制する必要があります。固定インターフェイスを使用するのがDNSサーバーだけの場合、必要なインターフェイスのルーティングテーブルにその特定のIPのルートを追加します。

Linuxでは、ip routeコマンドラインツールを使用してルーティングテーブルを変更できます。

+0

ありがとうございました。はい、私の場合は、複数のインターフェース(主に2つ以上)にわたるマルチパスのデフォルトルートがあります。これらのインターフェイスのそれぞれからDNSクエリを送信したいのですが、インターフェイスAとインターフェイスNを使用しているクエリを制御する必要があります。したがって、getaddrinfo()を呼び出すときにどのソースインターフェイスを選択するかを制御する必要があります。私はヒントの引数をチェックしましたが、オプションがあるようには思われません – caliuser

0

この問題の根本的な問題は、getaddrinfoがDNSのみで動作し、そのDNSルックアップの詳細を微調整できると思われることです。しかし、これはそうではありません。システム上のすべての名前解決機能を使用します。通常は、hostsファイルルックアップを行い、他のものはnsswitch.conf(通常はDNS)です。これらのDNS以外のルックアップの中には、送信元アドレスのバインディングが意味をなさない可能性があるため、最小公約数分母インターフェイスの一部ではありません。

特定の目的のために、DNS以外の場所からの名前検索の応答を必要としないことが分かっている場合は、代わりにDNS固有の関数を使用できます。 -チューニング。

gethostbyname dual network interfaces, select which one to use

関連する問題