Was ist der Unterschied zwischen AF_INET- und PF_INET-Konstanten?

Lesezeit: 3 Minuten

Benutzer-Avatar
Denilson Sá Maia

Wenn wir uns Beispiele zur Socket-Programmierung ansehen, können wir sehen, dass einige Leute verwenden AF_INET während andere verwenden PF_INET. Außerdem werden manchmal beide im selben Beispiel verwendet. Die Frage ist: Gibt es einen Unterschied zwischen ihnen? Welche sollten wir verwenden?

Wenn Sie das beantworten können, wäre eine andere Frage … Warum gibt es diese zwei ähnlichen (aber gleichen) Konstanten?


Was ich bisher herausgefunden habe:

Das socket manpage

Bei der (Unix-)Socket-Programmierung haben wir die socket() Funktion, die die folgenden Parameter erhält:

int socket(int domain, int type, int protocol);

Die Manpage sagt:

Das domain Argument gibt eine Kommunikationsdomäne an; dies wählt die Protokollfamilie aus, die für die Kommunikation verwendet wird. Diese Familien sind in definiert.

Und die Manpage zitiert AF_INET sowie einige andere AF_ Konstanten für die domain Parameter. Auch beim NOTES Abschnitt derselben Manpage können wir lesen:

Die unter 4.x BSD verwendeten Manifestkonstanten für Protokollfamilien sind PF_UNIX, PF_INET usw., während AF_UNIX usw. für Adressfamilien verwendet werden. Allerdings verspricht bereits die BSD-Manpage: “The protocol family is the same as the address family”, und nachfolgende Standards verwenden überall AF_*.

Die C-Header

Das sys/socket.h definiert diese Konstanten nicht wirklich, sondern schließt sie ein bits/socket.h. Diese Datei definiert etwa 38 AF_ Konstanten und 38 PF_ Konstanten wie diese:

#define PF_INET     2   /* IP protocol family.  */
#define AF_INET     PF_INET

Python

Das Python-Socket-Modul ist der C-API sehr ähnlich. Es gibt jedoch viele AF_ Konstanten, aber nur eine PF_ Konstante (PF_PACKET). Daher haben wir in Python keine andere Wahl als use AF_INET.

Ich denke, diese Entscheidung beinhaltet nur die AF_ Konstanten folgt einem der Leitprinzipien: „Es sollte einen – und vorzugsweise nur einen – offensichtlichen Weg geben, es zu tun.“ (Das Zen von Python)

Andere Information

Dieser Forumsbeitrag Links zu diese alte Nachrichtdie einige historische Informationen enthält.

  • Siehe auch diese doppelte Frage: stackoverflow.com/questions/6729366/…

    – Adam Rosenfield

    4. Januar 2016 um 22:57 Uhr

Ich denke, die Wikipedia-Anmerkungen dazu fasst es ganz gut zusammen:

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 unter Verwendung des Präfixes definiert AF_ Anstatt von PF_. Das AF_-Bezeichner 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 Umsetzungsunterstützung gefunden und die AF_-Konstanten wurden einfach durch die entsprechende Protokollkennung definiert, wodurch die Unterscheidung zwischen erfolgt AF_ gegen PF_ Konstanten ein technisches Argument ohne nennenswerte praktische Konsequenzen. In der Tat besteht viel Verwirrung bei der richtigen Verwendung beider Formen.

Selbst wenn jemand heute einen Grund hätte, einen Unterschied zu machen, müssten sie sich neue Kennungen einfallen lassen, sonst würde so viel Zeug kaputt gehen …

  • Kurz gesagt, es ist ein Konstruktionsfehler des Sterblichen. Wir müssen damit leben.

    – smWikipedia

    12. Februar 2011 um 7:10 Uhr


1384340cookie-checkWas ist der Unterschied zwischen AF_INET- und PF_INET-Konstanten?

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

Privacy policy