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

Lesezeit: 4 Minuten

Benutzeravatar von SP Sandhu
SP Sandhu

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

Ich bin verwirrt zwischen der Verwendung von AF_INET und PF_INET in socket() und bind().

Auch, wie man IP-Adresse eingibt sin_addr aufstellen?

  • Suchen Sie einfach im Netz: Ein Ergebnis ist Dies

    – Op DeCirkel

    18. Juli 2011 um 6:42 Uhr

  • Das habe ich mich auch schon gefragt. Sie scheinen im Socket-Aufruf zwischen verschiedenen Codierern austauschbar verwendet zu werden.

    – Hookenz

    21. August 2012 um 22:26 Uhr

  • @MattH Sie sind beide gleich wie bei den neuen Linux-Kernels. Das Gleiche finden Sie in Dukes Antwort unten.

    – SP Sandhu

    22. August 2012 um 4:48 Uhr

Damons Benutzeravatar
Damon

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

In einigen Dokumentationen wird ein mystisches “PF_INET” erwähnt. Dies ist eine seltsame ätherische Bestie, die in der Natur selten zu sehen ist, aber ich könnte es hier genauso gut 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.

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

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

  • Sicher, Duke, gilt das auch für frühere Kernel, ich meine Kernel vor Version 3.0?

    – SP Sandhu

    13. August 2012 um 8:08 Uhr

  • Soweit ich weiß, in allen Versionen von Kernel und Libc, PF_* == AF_*

    – Herzog

    7. September 2012 um 3:03 Uhr

  • Gilt das für Nicht-Linux-Plattformen?

    – Guter Mensch

    6. Februar 2013 um 4:30 Uhr

  • Ich denke, um sicherzugehen, müssen Sie die enthaltene Header-Datei überprüfen 🙂

    – Herzog

    26. Februar 2013 um 1:32 Uhr

  • Auf Ubuntu/Debian fand ich AF-Definitionen in /usr/src/linux-headers-<kernel_version>/include/linux/socket.h

    – Petr Jaworik

    5. April 2019 um 9:36 Uhr

Codemacs Benutzeravatar
Codemac

  • 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 zu lesen Steckdose(2) und binden(2). 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); 

  • danke @codemac, ich habe addr.sin_addr.s_addr = inet_addr(“127.0.0.1”); aber wofür ist inet_pton()?

    – SP Sandhu

    18. Juli 2011 um 7:26 Uhr

  • auch für Manpages, wenn ich man bind(2) oder man bind() tippe, gibt das Terminal einen unerwarteten Token-Fehler ‘(‘ aus, während man bind eine Erklärung für bind in Bash-Builtins gibt. Wie man eine Manpage für bind() erhält. Ich meine bind()-Funktion ?

    – SP Sandhu

    18. Juli 2011 um 7:31 Uhr

  • @jatt.beas: Die Syntax ist man <section> <topic>z.B man 2 bind.

    – Frerich Raabe

    18. Juli 2011 um 7:34 Uhr

Benutzeravatar von firo
Firo

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. In der Tat besteht viel Verwirrung bei der richtigen Verwendung beider Formen.

AF_INET = Adressformat, Internet = IP-Adressen

PF_INET = Paketformat, Internet = IP, TCP/IP oder UDP/IP

AF_INET ist die Adressfamilie, die für den von Ihnen erstellten Socket verwendet wird (in diesem Fall eine Internet Protocol-Adresse). Der Linux-Kernel unterstützt beispielsweise 29 andere Adressfamilien wie UNIX-Sockets und IPX sowie die Kommunikation mit IRDA und Bluetooth (AF_IRDA und AF_BLUETOOTH, aber es ist zweifelhaft, dass Sie diese auf einem so niedrigen Niveau verwenden werden).

Größtenteils ist das Festhalten an AF_INET für die Socket-Programmierung über ein Netzwerk die sicherste Option.

Das heißt, AF_INET bezieht sich auf Adressen aus dem Internet, insbesondere auf IP-Adressen.

PF_INET bezieht sich auf alles im Protokoll, normalerweise Sockets/Ports.

Benutzeravatar von Stefan Becker
Stefan Becker

Das Überprüfen der Header-Datei löst das Problem. Man kann dort nach dem System-Compiler suchen.

Für mein System AF_INET == PF_INET

AF == Adressfamilie und PF == Protokollfamilie

Protokollfamilien, die gleichen wie Adressfamilien.

Geben Sie hier die Bildbeschreibung ein

Benutzeravatar von user207421
Benutzer207421

Es gibt Situationen, wo es darauf ankommt.

Wenn Sie AF_INET übergeben socket() In Cygwin kann Ihr Socket zufällig zurückgesetzt werden oder nicht. Das Übergeben von PF_INET stellt sicher, dass die Verbindung richtig funktioniert.

Cygwin ist zugegebenermaßen ein riesiges Chaos für die Socket-Programmierung, aber es ist ein realer Fall, in dem AF_INET und PF_INET nicht identisch sind.

  • Bitte erkläre. ich finde #define PF_INET AF_INET bei Cygwin socket.h.

    – Benutzer207421

    18. Oktober 2017 um 6:07 Uhr

1426160cookie-checkWas ist der Unterschied zwischen AF_INET und PF_INET bei der Socket-Programmierung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy