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 des sockets?

Je suis confus entre L'utilisation de AF_INET et PF_INET dans socket() et bind().

Aussi, comment donner une adresse ip dans le Champ sin_addr?

169
demandé sur Flow 2011-07-18 10:37:37

6 réponses

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

Dans certaines documentations, vous verrez mention d'un "PF_INET" mystique. C'est une bête étrange etherial qui est rarement vu dans la nature, mais je autant le clarifier un peu ici. Une fois il y a longtemps, il a été je pensais que peut-être une famille d'adresses (ce que le" AF "dans" AF_INET " signifie for) pourrait prendre en charge plusieurs protocoles référencés par leur famille de protocole (ce que le " PF "dans" PF_INET" signifie).
Ce n'est pas arrivé. Oh bien. Donc, la bonne chose à faire est d'utiliser AF_INET dans votre struct sockaddr_in et PF_INET dans votre appel à socket (). Mais pratiquement parlant, vous pouvez utiliser AF_INET partout. Et, depuis C'est ce que W. Richard Stevens fait dans son livre, c'est ce que je vais faire ici.

202
répondu Damon 2011-07-18 18:20:50

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 de L'arbre 3.2.21 du noyau Linux.

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET
51
répondu Duke 2012-08-11 12:29:02
  • AF = famille D'adresses
  • PF = famille de protocoles

Sens, AF_INET fait référence aux adresses d'internet, adresses IP spécifiquement. PF_INET fait référence à n'importe quoi dans le protocole, généralement les sockets/ports.

Pensez à lire les pages de manuel pour socket (2) et bind(2). Pour le champ sin_addr, Faites simplement quelque chose comme ceci pour le définir:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 
46
répondu codemac 2014-04-07 00:33:14

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

Le concept de conception original de l'interface socket distinguait les types de protocole (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 ont été définis par des constantes symboliques supplémentaires, en utilisant le préfixe AF_ au lieu de PF_. Les af_-identifiants sont destinés à toutes les données structures 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_-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, beaucoup de confusion existe dans l'utilisation appropriée des deux formes.

10
répondu firo 2017-06-12 05:53:10

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 douteux que vous les utilisiez à un niveau aussi bas).

Pour la plupart du temps coller avec AF_INET pour la programmation de socket sur un réseau est l'option la plus sûre.

Sens, AF_INET fait référence aux adresses d'internet, adresses IP spécifiquement.

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

4
répondu DINO U 2015-06-22 16:25:56

Il y a des situations où cela compte.

Si vous passez AF_INET à socket() dans Cygwin, votre socket peut ou non être réinitialisé aléatoirement. Le passage de PF_INET garantit que la connexion fonctionne correctement.

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

1
répondu FlyingJester 2017-10-18 06:04:44