ソケットプログラミングの例を見ると、_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_ *が使用されています。
_sys/socket.h
_は実際にはこれらの定数を定義しませんが、代わりに_bits/socket.h
_を含みます。このファイルは、次のように約38個の_AF_
_定数と38個の_PF_
_定数を定義します。
_#define PF_INET 2 /* IP protocol family. */
#define AF_INET PF_INET
_
Pythonソケットモジュール はCAPIと非常によく似ています。ただし、多くの_AF_
_定数がありますが、_PF_
_定数(PF_PACKET)は1つだけです。したがって、Pythonでは、_AF_INET
_を使用する以外に選択肢はありません。
_AF_
_定数のみを含めるというこの決定は、「それを行うための明白な方法は1つ、できれば1つだけでなければならない」という指針の1つに従っていると思います。 (Pythonの禅)
私は これに関するウィキペディアのメモ それをかなりうまくまとめると思います:
プロトコルタイプ(ファミリ)とそれぞれが使用できる特定のアドレスタイプを区別するソケットインターフェイスの元の設計コンセプト。プロトコルファミリにはいくつかのアドレスタイプがあると想定されていました。アドレスタイプは、
AF_
の代わりにプレフィックスPF_
を使用して、追加のシンボリック定数によって定義されました。AF_
-識別子は、プロトコルファミリではなく、アドレスタイプを具体的に処理するすべてのデータ構造を対象としています。ただし、プロトコルとアドレスタイプの分離というこの概念では、実装のサポートが見つからず、AF_
-定数は対応するプロトコル識別子によって単純に定義され、AF_
定数とPF_
定数が区別されます。重要な実際的な結果のない技術的な議論。実際、両方の形式の適切な使用法には多くの混乱があります。
今日、誰かが違いを生む理由を思いついたとしても、彼らは新しい識別子を考え出さなければならないでしょう。