web-dev-qa-db-fra.com

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

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

Je suis confus d'utiliser AF_INET et PF_INET dans socket() et bind().

Aussi, comment donner l'adresse IP dans le champ sin_addr?

194
SP Sandhu

Le célèbre guide de programmation réseau de Beej donne une bonne explication:

Dans certaines documentations, vous verrez la mention d’un "PF_INET" mystique. C'est une étrange bête éthérée que l'on voit rarement dans la nature, mais je pourrais aussi bien le préciser un peu ici. Il y a très longtemps, on pensait qu'une famille d'adresses (ce que signifie "AF" dans "AF_INET") peut prendre en charge plusieurs protocoles référencés par leur famille de protocoles (ce que "PF" dans "PF_INET" signifie ).
Cela n'a pas eu lieu. Tant pis. Donc, la bonne chose à faire est d'utiliser AF_INET dans votre struct sockaddr_in et PF_INET dans votre appel à socket (). Mais pratiquement, vous pouvez utiliser AF_INET partout. Et, puisque c'est ce que W. Richard Stevens fait dans son livre, c'est ce que je vais faire ici.

233
Damon

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 3.2.21 du noyau Linux.

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET
65
Duke
  • AF = adresse famille
  • PF = Famille de protocole

Signification, AF_INET fait référence aux adresses d’Internet, plus précisément aux adresses IP. PF_INET fait référence à n'importe quoi du protocole, généralement des sockets/ports.

Lisez les pages de manuel relatives à socket (2) et bind (2) . Pour le champ sin_addr, procédez comme suit pour le définir:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 
47
codemac

En fait, AF_ et PF_ sont la même chose. Il y a quelques mots sur Wikipedia qui vont effacer votre confusion

Le concept original de l'interface de socket distinguait les types de protocoles (familles) des types d'adresses spécifiques que chacun pouvait utiliser. Il était envisagé qu'une famille de protocoles puisse avoir plusieurs types d'adresses. Les types d'adresse 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. Toutefois, ce concept de séparation du type de protocole et de l'adresse n'a pas trouvé de support d'application et les constantes AF_ ont été simplement définies par l'identificateur de protocole correspondant, faisant de la distinction entre constantes AF_ et PF_ un argument technique sans conséquence pratique significative. En effet, il y a beaucoup de confusion dans l'utilisation correcte des deux formes.

11
firo

AF_INET = Format d'adresse, Internet = Adresses IP

PF_INET = Format de paquet, Internet = IP, TCP/IP ou UDP/IP

AF_INET est la famille d'adresses utilisée pour le socket que vous créez (dans ce cas, une adresse de protocole Internet). Le noyau Linux, par exemple, prend en charge 29 autres familles d'adresses telles que les sockets UNIX et IPX, ainsi que les communications avec IRDA et Bluetooth (AF_IRDA et AF_BLUETOOTH, mais il est peu probable que vous les utilisiez à un niveau aussi bas).

Pour la plupart, s'en tenir à AF_INET pour la programmation de socket sur un réseau est l'option la plus sûre.

Signification, AF_INET fait référence aux adresses d’Internet, plus précisément aux adresses IP.

PF_INET fait référence à n'importe quoi dans le protocole, généralement des sockets/ports.

4
DINO U

Il y a des situations où cela compte.

Si vous transmettez AF_INET à socket() dans Cygwin, votre socket risque de ne pas être réinitialisé de manière aléatoire. Passer PF_INET garantit que la connexion fonctionne correctement.

Cygwin est certes un énorme gâchis pour la programmation de sockets, mais il est un cas concret où AF_INET et PF_INET ne sont pas identiques.

2
FlyingJester

Vérifier le fichier d'en-tête résout le problème. On peut vérifier leur compilateur système.

Pour mon système, AF_INET == PF_INET

AF == Famille d’adresses et PF == Famille de protocoles

Familles protocolaires, identiques aux familles d’adresses.

enter image description here

2
Rishap Singh