Quelle est la différence entre les constantes AF_INET et PF_INET?

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


Ce que j’ai découvert jusqu’à présent:

La page de manuel du 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.

Les en-têtes C

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 

Python

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)

Autre info

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 de PF_ . Les identificateurs AF_ 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 les AF_ AF_ ont été simplement définies par l’identifiant de protocole correspondant, rendant la distinction entre les constantes AF_ et PF_ 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 …