問題タブ [getaddrinfo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - ヒントを指定した getaddrinfo(3) ->ai_socktype が IPv6 アドレスを返さない
resolveipユーティリティの基本機能を模倣する次のコードを想定します。
最初で唯一の引数として呼び出された上記のコードは、次のgoogle.comようなものを出力します。
重複したエントリを取り除きたいとします。このようにして、取得したい結果の種類に関するヒントを含む構造を作成しましょう。getaddrinfo(3)次の変更は出力にまったく影響しません。これは、マンページで指定されているように、構造体がデフォルト値に初期化されるためです。
ai_socktypeフィールドに任意の値を指定して、重複するエントリを除外しましょう。
残念ながら、IPv6 アドレスが失われました。
元のヒントのないバージョンに戻りましょう。
代わりに手動フィルタリングを使用しましょう。
そして今、すべてが想定どおりに機能します。
getaddrinfo(3)関数にヒントを渡すことと、返されたレコードを手動でフィルタリングすることの間に矛盾が生じるのはどこから来たのか、私は興味があります。Linux カーネル 3.8.0-32 と glibc 2.17 でテスト済み。
c - インターネット接続が確立されていても、gethostbyname/getaddrinfo が失敗し続ける
バックグラウンド
Linux カーネル 2.6.35 を実行する小さなヘッドレス ボックスと、ARM ハードウェア上の Open Embedded ディストリビューションのいくつかのバリアントがあります。
私たちが知る限り、glibc 2.10.1 を使用しています。
ボックスには、接続されていないイーサネットと、シリアル接続された GSM/3G モデムがあります。インターネットへの接続を継続できるように PPP を構成しました。この部分は問題なく動作します。
ソケットを使用して何らかの接続を行う c (実際には c++) でコーディングされたプログラムがあります。このプログラムは、pthreads を使用して高度にマルチスレッド化されています。
接続先の IP アドレスを検索するには、gethostbyname() を使用します。
インターネットへの接続がない場合、たとえば初期ブート中または SIM カードがモデムから取り外された場合、gethostbyname() は本来あるべき NULL を返します。
症状
しかし、インターネット接続が稼働しているにもかかわらず、時折 gethostbyname() が NULL を返し続けます。
getaddrinfo() を使用した場合のエラー コードは EAI_NONAME ~ "名前またはサービスが不明です" です。gethostbyname() からのエラー コードは手元にありませんが、同等でした。
私たちの分析
(シリアルコンソール経由で)インターネット接続が正常であることを確認しました
- リスト項目
- /var/log/messages を確認し、pppd がすべて OK であることを確認しました
- ホスト名を ping します (IP に変換され、OK と応答します)
- パブリック IP 経由で ssh 経由でボックスに接続します
プロセスには、同じホストに対して gethostbyname() を使用する 2 つのスレッドがあります。コードパスと関数はわずかに異なりますが、gethostbyname() を呼び出す部分を含め、ソケット関数に共通のコードを使用します。
gethostbyname() が NULL を返し続ける状況では、これは通常、スレッドの 1 つにのみ当てはまり、毎回同じスレッドではありません。もう1つはルックアップを完全に行います。
さらに、失敗した gethostbyname() を持つスレッドは、そのスレッドを簡単に制御して停止し、関数を再起動することで簡単に機能させることができます。これにより、新しいスレッドが pthread 単位で生成されます。
全体として、DNS 変換とインターネット接続が OS レベルで正常に機能していると確信しています。
スレッド化の問題を排除するために、マニュアル ページに従って再入可能である getaddrinfo() を使用してルックアップ コードを再実装しました。そして、まったく同じ結果が得られます。
スレッドを終了すると、gethostbyname()/getaddrinfo() のルックアップ機能に影響を与えるある種のクリーンアップが発生するようです。
回避策は、失敗したスレッドを強制的に終了させることですが、これはアプリケーション構造の大幅な変更を意味し、実際にはオプションではありません。
質問
質問は次のとおりです。解決策を探す場所や、実際の問題がどこにあるのか、何かヒントはありますか?
sockets - getaddrinfo のヒント パラメータとは何ですか?
hintsパラメータの使い方がわかりませんgetaddrinfo()
以下のような同じサンプル コードは、値が設定されないかのgetadderinfo()ように読み取れません。hintshints
http://manpages.ubuntu.com/manpages/hardy/man3/getaddrinfo.3.html
http://www.freebsd.org/cgi/man.cgi?query=getaddrinfo&sektion=3
では、何hintsのためですか?
hintswhenの値を確認する必要がありgetaddrinfoますか?
c - Windows で getaddrinfo() を使用する方法
mingw+msys で APP をビルドしようとしています。
私のコードはwinsockを使用しています。コンパイルすると、次のエラーメッセージが表示されます。
これは、いくつかのヘッダーを変更して Linux から移行した私のコードです。
gettarrinfo()Windows ではどのように使用できますか?
dgreendayさんの記事を試してみてメッセージが変わったという追加情報です。
c - ネットワーク内のすべてのアクティブなルーターの IP アドレスをプログラムで取得する
最終年度のプロジェクトの一部として、ネットワーク内のすべてのアクティブなルーターの IP アドレスのリストを取得しgetaddrinfoて、AI_ADDRCONFIGフラグを使用して IPv6 ステータスを取得したいと考えています。
の現在の実装はgetaddrinfo一度に 1 つの IP で動作し、別の IP を確認する必要があるたびにソースから IP を変更する必要があります。私の目的は、アクティブなルーターの IP アドレスのリストを作成し、IP アドレスをgetaddrinfoメソッドに解析することです。
専門家が参考文献を教えてくれたりget all the IP addresses of active routers、ネットワーク内のサンプル コード セグメントを提供してくれたりすると、本当にありがたいです。
PS:スタックオーバーフローでこのトピックに関する同様の投稿(ネットワーク上のすべてのアクティブなマシンのIPを見つける)を見つけましたが、これらはJavaとAndroidの場合であり、私のトピックよりもわずかにトピックから外れているため、役に立ちませんでした()。