2

で呼び出すgetaddrinfoAF_UNSPEC、理論的には好きなアドレス ファミリを返すことができます: AF_INET、、AF_INET6おそらく AppleTalk、Bluetooth、データリンク、ネットリンク アドレス...

実際には、ほとんどのプラットフォームで返されるだけAF_INETですAF_INET6

  • FreeBSD では、AF_INETorのみを返すことができAF_INET6ます (ソースで確認)
  • Linuxでは、同上(glibcのマンページによる)
  • Windows では、同様に、「ai_family の AF_UNSPEC の値は、呼び出し元が AF_INET および AF_INET6 アドレス ファミリのみを受け入れることを示します。」[MSDN、getaddrinfo]

他のシステムはどうですか?他のアドレス構造を取得できるプラットフォームはありますか?

私は特に MacOS に疑いを持っています。ソースが opensource.apple.com/source/Libc から欠落しているようで、マンページには記載されていません。getaddrinfo が他のアドレス ファミリを返したことを示す可能性がある Mac のテスト ランからの再現不可能なログ ファイルがあります。サポートしているその他のプラットフォームは、AIX、Solaris、HP-UX です。

返された構造でファミリを確認できることはわかっています。ただし、AF_INET(6) 以外の結果を得るために、どのような興味深い文字列やヒントを使用する必要があるかはわかりません。

4

3 に答える 3

1

いかなる種類の保証もありません。私が独自のプロトコルを考案し、(ローカルで) 番号を割り当て、プログラムが付けた名前を私のプロトコルが解決できる場合sockaddr、私のアドレス ファミリに対して a を返すことは許されます。

基本的に、 を渡すAF_UNSPECと、次の 2 つのいずれかを行うことができます。

  1. PF_*定数が定数にマップされていると仮定しAF_*、そのタイプのソケットを作成して接続し、自作プロトコルの即時サポートを提供します

  2. 理解できないアドレス ファミリを含む結果は無視して、次の結果に進みます。

名前は検索できても、目的のタイプのアドレスがない可能性が高いことに注意する必要があります。でルックアップをAF_UNSPEC実行すると、肯定的なルックアップ結果が得られるため、自分でエラー条件を作成する必要があります。

アプリの理想的な動作は、最初の結果が機能しない場合に他の結果にフォールバックすることであるため (失敗したサーバーでの DNS ラウンドロビンを考えてください)、これは、成功するまで結果を繰り返し、エラーを調整することで実現できます。原因 (つまり、「必要なタイプのアドレスがありません」から開始し、それが見つかって接続が失敗した場合は、「宛先に到達できません」に切り替えます)。

于 2013-09-04T17:30:38.883 に答える
-1

返される AF_* 値の範囲は、構造体の型のサイズによってのみ制限されます。カスタム ドライバー/ネットワークが独自のアドレスを返すことは完全に正当です。もちろん、特定のエンドポイントを使用するセマンティクスを理解するために、任意の値を照合するためのヘッダーがあるものに限定されます。

考えられるすべての AF_* シンボルの合計列挙を作成しようとすることはできますが、OS ドライバーがそのプロトコルを指定するために使用しているものと一致する値を定義するヘッダーがなければ、名前は無意味です。ここに私が見つけたほんのいくつかがあります:

など

Linux は Linux であるため、socket.h にそれらのほとんどがありますが、それらの値は、そのカーネルとそれらのドライバーの外部で有効であるとは限りません。

于 2013-09-05T08:38:03.337 に答える