En fait, AF_ et PF_ sont la même chose. Il y a quelques mots sur Wikipédia qui dissiperont votre confusion
Le concept de conception original de l'interface socket faisait la distinction entre les types de protocoles (familles) et les types d'adresses spécifiques que chacun peut utiliser. Il a été envisagé qu'une famille de protocoles puisse avoir plusieurs types d'adresses. Les types d'adresses étaient définis par des constantes symboliques supplémentaires, 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 protocole et du type d'adresse n'a pas trouvé de support d'implémentation et les constantes AF_ étaient simplement définies par l'identifiant de protocole correspondant, faisant de la distinction entre les constantes AF_ et PF_ un argument technique sans conséquence pratique significative. En effet, il existe une grande confusion dans l'utilisation correcte des deux formes.
J'ai trouvé dans le code source du noyau Linux que PF_INET et AF_INET sont identiques. Le code suivant provient du fichier include/linux/socket.h , ligne 204 de l'arborescence du noyau Linux 3.2.21.
/* Protocol families, same as address families. */
...
#define PF_INET AF_INET
Le célèbre guide de programmation réseau de Beej donne une belle explication :
Dans certaines documentations, vous verrez la mention d'un "PF_INET" mystique. Il s'agit d'une bête éthérée étrange que l'on voit rarement dans la nature, mais je pourrais aussi bien le clarifier un peu ici. Il y a longtemps, on pensait qu'une famille d'adresses (ce que signifie « AF » dans « AF_INET ») pouvait prendre en charge plusieurs protocoles référencés par leur famille de protocoles (ce que signifie « PF » dans « PF_INET »).
Cela ne s'est pas produit. Tant pis. La bonne chose à faire est donc d'utiliser AF_INET dans votre structure sockaddr_in et PF_INET dans votre appel à socket(). Mais en pratique, vous pouvez utiliser AF_INET partout. Et, puisque c'est ce que fait W. Richard Stevens dans son livre, c'est ce que je vais faire ici.
- AF =famille d'adresses
- PF =famille de protocoles
Signification, AF_INET
fait référence aux adresses provenant d'Internet, les adresses IP en particulier. PF_INET
fait référence à n'importe quoi dans le protocole, généralement des sockets/ports.
Envisagez de lire les pages de manuel pour socket(2) et bind(2). Pour le sin_addr
champ, faites simplement quelque chose comme ce qui suit pour le définir :
struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);