En regardant des exemples de programmation de socket, nous pouvons voir que certaines personnes utilisent AF_INET
tandis que d’autres utilisent PF_INET
. De plus, parfois les deux sont utilisés dans le même exemple . La question est: Y a-t-il une différence entre eux? Lequel devrions-nous utiliser?
Si vous pouvez répondre à cela, une autre question serait … Pourquoi ces deux constantes similaires (mais égales)?
socket
Dans la programmation de socket (Unix), nous avons la fonction socket()
qui reçoit les parameters suivants:
int socket(int domain, int type, int protocol);
La page de manuel dit:
L’argument de
domain
spécifie un domaine de communication; ceci sélectionne la famille de protocoles qui sera utilisée pour la communication. Ces familles sont définies dans .
Et la page de AF_INET
cite AF_INET
ainsi que d’autres constantes AF_
pour le paramètre domain
. De plus, à la section NOTES
de la même page de manuel, on peut lire:
Les constantes de manifeste utilisées sous BSD 4.x pour les familles de protocoles sont PF_UNIX, PF_INET, etc., tandis que AF_UNIX etc. sont utilisées pour les familles d’adresses. Cependant, la page de manuel de BSD promet déjà: “La famille de protocoles est généralement la même que la famille d’adresses”, et les normes suivantes utilisent AF_ * partout.
Le sys/socket.h
ne définit pas réellement ces constantes, mais inclut plutôt les bits/socket.h
. Ce fichier définit environ 38 constantes AF_
et 38 constantes PF_
comme ceci:
#define PF_INET 2 /* IP protocol family. */ #define AF_INET PF_INET
Le module de socket Python est très similaire à l’API C. Cependant, il existe de nombreuses constantes AF_
mais une PF_
constante PF_ (PF_PACKET). Ainsi, en Python, nous n’avons pas d’autre choix que d’utiliser AF_INET
.
Je pense que cette décision d’inclure uniquement les constantes AF_
suit l’un des principes directeurs: “Il devrait y avoir une – et de préférence une seule – méthode évidente pour le faire.” (Le Zen de Python)
Ce forum affiche des liens vers cet ancien message contenant des informations historiques.
Je pense que les notes de Wikipedia sur ce résumé résument bien:
Le concept de conception original de l’interface socket a distingué les types de protocole (familles) et les types d’adresses spécifiques que chacun peut utiliser. Il était envisagé qu’une famille de protocoles puisse avoir plusieurs types d’adresses. Les types d’adresses ont été définis par des constantes symboliques supplémentaires, en utilisant le préfixe
AF_
au lieu dePF_
. Les identificateursAF_
sont destinés à toutes les structures de données qui traitent spécifiquement du type d’adresse et non de la famille de protocoles. Cependant, ce concept de séparation du type de protocole et d’adresse n’a pas trouvé de support d’implémentation et lesAF_
AF_ ont été simplement définies par l’identifiant de protocole correspondant, rendant la distinction entre les constantesAF_
etPF_
un argument technique sans conséquence pratique significative. En effet, il existe beaucoup de confusion dans le bon usage des deux formes.
Même si quelqu’un avait une raison de faire la différence aujourd’hui, il devrait trouver de nouveaux identifiants ou tant de choses se briseraient …