GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist der Unterschied zwischen AF_INET und PF_INET bei der Socket-Programmierung?

Tatsächlich sind AF_ und PF_ dasselbe. Es gibt einige Wörter auf Wikipedia, die Ihre Verwirrung beseitigen werden

Das ursprüngliche Entwurfskonzept der Socket-Schnittstelle unterschied zwischen Protokolltypen (Familien) und den spezifischen Adresstypen, die jeder verwenden kann. Es wurde in Betracht gezogen, dass eine Protokollfamilie mehrere Adresstypen haben kann. Adresstypen wurden durch zusätzliche symbolische Konstanten definiert, wobei das Präfix AF_ anstelle von PF_ verwendet wurde. Die AF_-Kennungen sind für alle Datenstrukturen gedacht, die sich speziell mit dem Adresstyp und nicht mit der Protokollfamilie befassen. Dieses Konzept der Trennung von Protokoll und Adresstyp hat jedoch keine Implementierungsunterstützung gefunden, und die AF_-Konstanten wurden einfach durch die entsprechende Protokollkennung definiert, was die Unterscheidung zwischen AF_- und PF_-Konstanten zu einem technischen Argument ohne wesentliche praktische Konsequenzen macht. Tatsächlich herrscht viel Verwirrung bei der korrekten Verwendung beider Formen.


Ich habe im Linux-Kernel-Quellcode gefunden, dass PF_INET und AF_INET identisch sind. Der folgende Code stammt aus der Datei include/linux/socket.h , Zeile 204 des Linux-Kernel-3.2.21-Baums.

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

Beejs berühmter Leitfaden zur Netzwerkprogrammierung gibt eine nette Erklärung:

In einigen Dokumentationen wird ein mystisches „PF_INET“ erwähnt. Dies ist ein seltsames ätherisches Tier, das selten in der Natur zu sehen ist, aber ich möchte es hier auch ein wenig erläutern. Vor langer Zeit dachte man, dass eine Adressfamilie (wofür das „AF“ in „AF_INET“ steht) mehrere Protokolle unterstützen könnte, die von ihrer Protokollfamilie referenziert werden (wofür das „PF“ in „PF_INET“ steht).
Das ist nicht passiert. Nun ja. Das Richtige ist also, AF_INET in Ihrer Struktur sockaddr_in und PF_INET in Ihrem Aufruf von socket() zu verwenden. Aber praktisch kann man AF_INET überall verwenden. Und da W. Richard Stevens das in seinem Buch tut, werde ich das hier tun.


  • AF =Adressfamilie
  • PF =Protokollfamilie

Bedeutung, AF_INET bezieht sich auf Adressen aus dem Internet, insbesondere IP-Adressen. PF_INET bezieht sich auf alles im Protokoll, normalerweise Sockets/Ports.

Erwägen Sie, die Manpages für socket(2) und bind(2) zu lesen. Für die sin_addr Feld, tun Sie einfach etwas wie das Folgende, um es einzustellen:

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

Linux
  1. Was ist der Unterschied zwischen Redhat und CentOS?

  2. Was ist der Unterschied zwischen strtok_r und strtok_s in C?

  3. Was ist der Unterschied zwischen fsck und e2fsck?

  4. Was ist der Unterschied zwischen ls und l?

  5. Was ist der Unterschied zwischen $(CC) und $CC?

Was ist der Unterschied zwischen Linux und Unix?

Was ist der Unterschied zwischen Login- und Non-Login-Shell

Was ist der Unterschied zwischen apt und dem Befehl apt-get?

Was ist der Unterschied zwischen Git Switch und Checkout?

Was ist ein Hypervisor? Was ist der Unterschied zwischen Typ 1 und 2?

Was ist der Unterschied zwischen Curl und Wget?