GNU/Linux >> Linux の 問題 >  >> Linux

ソケットプログラミングにおける AF_INET と PF_INET の違いは何ですか?

実際、AF_ と PF_ は同じものです。ウィキペディアには、あなたの混乱を解消する言葉がいくつかあります

<ブロック引用>

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


Linux カーネル ソース コードで、PF_INET と AF_INET が同じであることがわかりました。次のコードは、ファイル include/linux/socket.h からのものです。 、Linux カーネル 3.2.21 ツリーの 204 行目。

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET

Beej の有名なネットワーク プログラミング ガイドでは、適切な説明が提供されています。

<ブロック引用>

一部のドキュメントでは、神秘的な「PF_INET」について言及されています。これは、自然界ではめったに見られない奇妙なエーテルの獣ですが、ここで少し明確にすることもできます。むかしむかし、アドレス ファミリ (「AF_INET」の「AF」が表すもの) は、プロトコル ファミリ (「PF_INET」の「PF」が表すもの) によって参照されるいくつかのプロトコルをサポートする可能性があると考えられていました。
それは起こりませんでした。しかたがない。したがって、正しいことは、struct sockaddr_in で AF_INET を使用し、socket() の呼び出しで PF_INET を使用することです。しかし実際には、どこでも AF_INET を使用できます。そして、それは W. Richard Stevens が彼の著書で行っていることなので、私もここで行います。


  • AF =アドレス ファミリー
  • PF =プロトコル ファミリー

つまり、AF_INET インターネットからのアドレス、具体的には IP アドレスを指します。 PF_INET 通常はソケット/ポートなど、プロトコル内のあらゆるものを指します。

socket(2) および bind(2) の man ページを読むことを検討してください。 sin_addr の場合 次のようにして設定します:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 

Linux
  1. RedhatとcentOSの違いは何ですか?

  2. fsck と e2fsck の違いは何ですか?

  3. 「su -」と「su --login」の違いは何ですか?

  1. InnoDBとMyISAMの違いは何ですか?

  2. [[$ a ==Z*]]と[$a==Z *]の違いは?

  3. unlink と rm の違いは何ですか?

  1. Gitスイッチとチェックアウトの違いは何ですか?

  2. insmodとmodprobeの違いは何ですか

  3. ミューテックスとクリティカルセクションの違いは何ですか?