ソケットプログラミングにおけるAF_INETとPF_INETの違いは何ですか?
socket()
とbind()
でAF_INETとPF_INETを使用することで混乱しています。
また、sin_addr
フィールドにIPアドレスを与える方法は?
Beejの有名なネットワークプログラミングガイド は、いい説明を与えます:
いくつかのドキュメントでは、神秘的な「PF_INET」について言及しています。これは、自然界ではめったに見られない奇妙なエーテル獣ですが、ここで少し明確にすることもできます。かつて、アドレスファミリ( "AF_INET"の "AF"が表すもの)は、プロトコルファミリによって参照される複数のプロトコル( "PF_INET"の "PF"が表すもの)をサポートすると考えられていました。 )。
それは起こりませんでした。しかたがない。そのため、正しい方法は、struct sockaddr_inでAF_INETを使用し、socket()の呼び出しでPF_INETを使用することです。しかし、実際には、AF_INETはどこでも使用できます。そして、それがW.リチャードスティーブンスが彼の本で行っていることなので、それがここでやることです。
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
実際、AF_とPF_は同じものです。ウィキペディアにいくつかの言葉がありますが、あなたの混乱は解消されます
ソケットインターフェイスの元の設計概念は、プロトコルの種類(ファミリ)と、それぞれが使用できる特定のアドレスの種類を区別していました。プロトコルファミリには複数のアドレスタイプが含まれることが想定されていました。アドレスタイプは、PF_の代わりにプレフィックスAF_を使用して、追加の記号定数によって定義されました。 AF_-identifiersは、プロトコルファミリではなくアドレスタイプを特に扱うすべてのデータ構造を対象としています。ただし、このプロトコルとアドレスタイプの分離の概念には実装のサポートがなく、AF_定数は対応するプロトコル識別子によって単純に定義されていたため、AF_定数とPF_定数の区別は重要な実用的結果のない技術的議論になりました。実際、両方の形式を適切に使用することには多くの混乱があります。
AF_INET =アドレス形式、インターネット= IPアドレス
PF_INET =パケット形式、インターネット= IP、TCP/IPまたはUDP/IP
AF_INETは、作成しているソケット(この場合はインターネットプロトコルアドレス)に使用されるアドレスファミリです。たとえば、Linuxカーネルは、UNIXソケットやIPXなどの他の29のアドレスファミリをサポートし、IRDAおよびBluetooth(AF_IRDAおよびAF_BLUETOOTH、ただしこれらを低レベルで使用することは疑わしい)との通信もサポートします。
ほとんどの場合、ネットワーク経由のソケットプログラミングでAF_INETを使用するのが最も安全なオプションです。
つまり、AF_INETはインターネットからのアドレス、特にIPアドレスを指します。
PF_INETは、プロトコル内のあらゆるもの、通常はソケット/ポートを指します。
重要な状況があります。
Cygwinのsocket()
にAF_INETを渡すと、ソケットがランダムにリセットされる場合とされない場合があります。 PF_INETを渡すと、接続が正しく機能することが保証されます。
Cygwinはソケットプログラミングにとっては自明のことですが、それはis AF_INETとPF_INETが同一ではない現実のケースです。
ヘッダーファイルを確認することで問題が解決します。システムコンパイラがあるかどうかを確認できます。
私のシステムでは、AF_INET == PF_INET
AF ==アドレスファミリおよびPF ==プロトコルファミリ
プロトコルファミリ、アドレスファミリと同じ。