256 votes

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 ne sais pas s'il est possible d'utiliser AF_INET et PF_INET dans le cadre d'un projet de recherche. socket() y bind() .

De même, comment donner l'adresse IP dans le champ sin_addr champ ?

0 votes

Il suffit de faire une recherche sur le net : un des résultats est ce

0 votes

Je me suis également posé la question. Il semble qu'ils soient utilisés de manière interchangeable dans l'appel de prise entre différents codeurs.

0 votes

@MattH Les deux sont identiques selon les nouveaux noyaux Linux. Vous pouvez trouver la même chose dans la réponse de Duke ci-dessous.

302voto

Damon Points 26437

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

Dans certaines documentations, vous verrez la mention d'un mystique "PF_INET". Il s'agit d'une bête éthérée bizarre qui est rarement vue dans la nature, mais je mais je pourrais tout aussi bien le clarifier un peu ici. Il y a longtemps, on a pensé pensé que peut-être une famille d'adresse (ce que le "AF" dans "AF_INET" représente AF" dans "AF_INET") pourrait supporter plusieurs protocoles référencés par leur famille de famille de protocoles (ce que représente le "PF" dans "PF_INET").
Cela ne s'est pas produit. Mais bon. Donc la bonne chose à faire est d'utiliser AF_INET dans votre struct sockaddr_in et PF_INET dans votre appel à socket(). Mais En pratique, vous pouvez utiliser AF_INET partout. Et, puisque Et comme c'est ce que W. Richard Stevens fait dans son livre, c'est ce que je vais faire ici.

90voto

Duke Points 191

J'ai trouvé dans le code source du noyau Linux que PF_INET et AF_INET sont les mêmes. Le code suivant provient du fichier include/linux/socket.h , ligne 204 du noyau Linux 3.2.21 arbre.

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET

0 votes

Bien sûr Duke, est-ce que c'est la même chose pour les noyaux précédents, c'est-à-dire les noyaux antérieurs à la version 3.0 ?

4 votes

Pour autant que je sache, dans toutes les versions du noyau et de la libc, PF_* == AF_*.

0 votes

Est-ce vrai sur les plates-formes non-linux ?

60voto

codemac Points 689
  • AF = Famille d'adresses
  • PF = Famille de protocoles

C'est-à-dire, AF_INET fait référence aux adresses de l'internet, plus précisément aux adresses IP. PF_INET fait référence à n'importe quel élément du protocole, généralement les sockets/ports.

Pensez à lire les pages de manuel de prise (2) y lier(2) . Pour le sin_addr il suffit de faire 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);

0 votes

Merci @codemac , j'ai utilisé addr.sin_addr.s_addr = inet_addr("127.0.0.1") ; mais à quoi sert inet_pton() ?

0 votes

Aussi pour les pages de man, quand je tape man bind(2) ou man bind() , le terminal donne une erreur inattendue de token '(' alors que man bind donne une explication de bind dans les buildins bash. Comment obtenir la page de manuel de la fonction bind(), c'est-à-dire bind() ?

0 votes

@jatt.beas : La syntaxe est man <section> <topic> par exemple man 2 bind .

15voto

firo Points 83

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

Le concept original de l'interface socket distinguait les types de protocoles (familles) et les types d'adresses spécifiques que chacun pouvait utiliser. Il était prévu 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 de mise en œuvre et les constantes AF_ ont simplement été 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, une grande confusion règne quant à l'utilisation correcte des deux formes.

1voto

FlyingJester Points 1

Il y a des situations où cela compte.

Si vous passez AF_INET à socket() dans Cygwin, votre socket peut ou non être réinitialisé de manière aléatoire. Passer PF_INET assure que la connexion fonctionne correctement.

Cygwin est, de son propre aveu, un énorme gâchis pour la programmation de socket, mais il es un cas réel où AF_INET et PF_INET ne sont pas identiques.

15 votes

Veuillez expliquer. Je trouve #define PF_INET AF_INET dans le programme de Cygwin socket.h .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X