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);