web-dev-qa-db-ja.com

AF_INET定数とPF_INET定数の違いは何ですか?

ソケットプログラミングの例を見ると、_AF_INET_を使用している人もいれば、_PF_INET_を使用している人もいることがわかります。さらに、時々 両方とも同じ例で使用されます 。問題は、それらの間に違いはありますか?どちらを使うべきですか?

あなたがそれに答えることができれば、別の質問は次のようになります...なぜこれらの2つの類似した(しかし等しい)定数があるのですか?


私がこれまでに発見したこと:

socketのマンページ

(Unix)ソケットプログラミングでは、次のパラメータを受け取るsocket()関数があります。

_int socket(int domain, int type, int protocol);
_

マンページには次のように書かれています。

domain引数は通信ドメインを指定します。これにより、通信に使用されるプロトコルファミリが選択されます。これらのファミリは<sys/socket.h>で定義されています。

また、マンページでは、domainパラメータの_AF_INET_およびその他の_AF__定数を引用しています。また、同じマンページのNOTESセクションで、次のように読むことができます。

4.x BSDでプロトコルファミリに使用されるマニフェスト定数はPF_UNIX、PF_INETなどですが、AF_UNIXなどはアドレスファミリに使用されます。ただし、すでにBSDのマニュアルページでは「プロトコルファミリは一般にアドレスファミリと同じです」と約束されており、その後の標準ではどこでもAF_ *が使用されています。

Cヘッダー

_sys/socket.h_は実際にはこれらの定数を定義しませんが、代わりに_bits/socket.h_を含みます。このファイルは、次のように約38個の_AF__定数と38個の_PF__定数を定義します。

_#define PF_INET     2   /* IP protocol family.  */
#define AF_INET     PF_INET
_

Python

Pythonソケットモジュール はCAPIと非常によく似ています。ただし、多くの_AF__定数がありますが、_PF__定数(PF_PACKET)は1つだけです。したがって、Pythonでは、_AF_INET_を使用する以外に選択肢はありません。

_AF__定数のみを含めるというこの決定は、「それを行うための明白な方法は1つ、できれば1つだけでなければならない」という指針の1つに従っていると思います。 (Pythonの禅)

他の情報

このフォーラム投稿 へのリンク この古いメッセージ 、いくつかの履歴情報が含まれています。

30

私は これに関するウィキペディアのメモ それをかなりうまくまとめると思います:

プロトコルタイプ(ファミリ)とそれぞれが使用できる特定のアドレスタイプを区別するソケットインターフェイスの元の設計コンセプト。プロトコルファミリにはいくつかのアドレスタイプがあると想定されていました。アドレスタイプは、AF_の代わりにプレフィックスPF_を使用して、追加のシンボリック定数によって定義されました。 AF_-識別子は、プロトコルファミリではなく、アドレスタイプを具体的に処理するすべてのデータ構造を対象としています。ただし、プロトコルとアドレスタイプの分離というこの概念では、実装のサポートが見つからず、AF_-定数は対応するプロトコル識別子によって単純に定義され、AF_定数とPF_定数が区別されます。重要な実際的な結果のない技術的な議論。実際、両方の形式の適切な使用法には多くの混乱があります。

今日、誰かが違いを生む理由を思いついたとしても、彼らは新しい識別子を考え出さなければならないでしょう。

24
Michael Burr