GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la différence entre AF_INET et PF_INET dans la programmation de socket ?

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

Linux
  1. La Différence Entre [[ $a ==Z* ]] Et [ $a ==Z* ] ?

  2. Quelle est la différence entre Redhat et centOS ?

  3. Quelle est la différence entre insmod et modprobe

  4. Quelle est la différence entre le mutex et la section critique ?

  5. Quelle est la différence entre fsck et e2fsck ?

Quelle est la différence entre Linux et Unix ?

Quelle est la différence entre la connexion et le shell sans connexion

Quelle est la différence entre la commande apt et apt-get ?

Quelle est la différence entre Git Switch et Checkout ?

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?