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 indefiniert.
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