ソケットプログラミングにおけるAF_INETとPF_INETの違いは何ですか?
とでAF_INETとPF_INETを使用するのが混乱しsocket()
ていbind()
ます。
また、sin_addr
フィールドにIPアドレスを与える方法は?
ソケットプログラミングにおけるAF_INETとPF_INETの違いは何ですか?
とでAF_INETとPF_INETを使用するのが混乱しsocket()
ていbind()
ます。
また、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は同じであることがわかりました。次のコードは、Linuxカーネル3.2.21ツリーの204行目のinclude / linux / socket.hファイルからのものです。
/* Protocol families, same as address families. */
...
#define PF_INET AF_INET
/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
意味、AF_INET
インターネットからのアドレス、具体的にはIPアドレスを指します。PF_INET
プロトコル内のすべてのことを指し、通常はソケット/ポートです。
socket(2)およびbind(2)のマニュアルページを読むことを検討してください。sin_addr
フィールドについては、次のように設定してください。
struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
man <section> <topic>
、たとえばman 2 bind
です。
実際、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は、プロトコル内のすべてのものを指し、通常はソケット/ポートです。
それが重要な状況があります。
socket()
CygwinでAF_INETを渡すと、ソケットがランダムにリセットされる場合とされない場合があります。PF_INETを渡すと、接続が正しく機能します。
Cygwinは確かにソケットプログラミングにとって大きな混乱ですが、これは AF_INETとPF_INETが同一でない実際のケースです。
#define PF_INET AF_INET
Cygwin ので見つけますsocket.h
。