Dans certains documents, vous verrez la mention d'un "PF_INET" mystique. C'est une bête éthérée étrange qui est rarement vue dans la nature, mais je pourrais aussi bien 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 "PF" dans "PF_INET" signifie ).
Cela ne s'est pas produit. 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 en pratique, vous pouvez utiliser AF_INET partout. Et, puisque c'est ce que W. Richard Stevens fait dans son livre, c'est ce que je ferai ici.
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'arborescence du noyau Linux 3.2.21.
/* Protocol families, same as address families. */...#define PF_INET AF_INET
bien sûr Duke, est-ce la même chose pour les noyaux précédents aussi, je veux dire les noyaux avant la version 3.0?
SP Sandhu
1
Pour autant que je sache, dans toutes les versions du noyau et de la libc, PF_ * == AF_ *
Duke
Est-ce vrai sur les plates-formes non Linux?
Good Person
1
Je pense que pour vous assurer, vous devez vérifier le fichier d'en-tête inclus :)
Duke
Sur Ubuntu / Debian, j'ai trouvé des définitions AF dans/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
Petr Javorik
48
AF = famille d'adresses
PF = famille de protocoles
Cela signifie, AF_INETfait référence aux adresses Internet, spécifiquement aux adresses IP. PF_INETfait référence à n'importe quoi dans le protocole, généralement des sockets / ports.
Pensez à lire les pages de manuel pour socket (2) et bind (2) . Pour le sin_addrchamp, faites simplement quelque chose comme ceci pour le définir:
merci @codemac, j'ai utilisé addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); mais à quoi sert inet_pton ()?
SP Sandhu
également pour les pages de manuel, lorsque je tape man bind (2) ou man bind (), le terminal donne un jeton inattendu '(' erreur alors que man bind donne une explication de bind dans les commandes bash. Comment obtenir la page de manuel pour bind (). je veux dire Fonction bind ()?
SP Sandhu
@ jatt.beas: La syntaxe est man <section> <topic>, par exemple man 2 bind.
Frerich Raabe
11
En fait, AF_ et PF_ sont la même chose. Il y a quelques mots sur Wikipédia pour effacer votre confusion
Le concept de conception original de l'interface de socket faisait la distinction entre les types de protocoles (familles) et les types d'adresses spécifiques que chacun peut utiliser. Il était 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 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_ ont été 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, une grande confusion règne dans l'utilisation correcte des deux formes.
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, coller avec AF_INET pour la programmation de socket sur un réseau est l'option la plus sûre.
Autrement dit, AF_INET fait référence aux adresses Internet, spécifiquement aux adresses IP.
PF_INET fait référence à n'importe quoi dans le protocole, généralement des sockets / ports.
Si vous passez AF_INET à socket()dans Cygwin, votre socket peut être réinitialisée de manière aléatoire ou non. Passer PF_INET garantit que la connexion fonctionne correctement.
Cygwin est auto-certes un énorme gâchis pour la programmation socket, mais il est un cas réel du monde où AF_INET et PF_INET ne sont pas identiques.
Réponses:
Le célèbre guide de programmation réseau de Beej donne une belle explication:
la source
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'arborescence du noyau Linux 3.2.21.
la source
/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
Cela signifie,
AF_INET
fait référence aux adresses Internet, spécifiquement aux adresses IP.PF_INET
fait référence à n'importe quoi dans le protocole, généralement des sockets / ports.Pensez à lire les pages de manuel pour socket (2) et bind (2) . Pour le
sin_addr
champ, faites simplement quelque chose comme ceci pour le définir:la source
man <section> <topic>
, par exempleman 2 bind
.En fait, AF_ et PF_ sont la même chose. Il y a quelques mots sur Wikipédia pour effacer votre confusion
la source
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, coller avec AF_INET pour la programmation de socket sur un réseau est l'option la plus sûre.
Autrement dit, AF_INET fait référence aux adresses Internet, spécifiquement aux adresses IP.
PF_INET fait référence à n'importe quoi dans le protocole, généralement des sockets / ports.
la source
Il y a des situations où cela compte.
Si vous passez AF_INET à
socket()
dans Cygwin, votre socket peut être réinitialisée de manière aléatoire ou non. Passer PF_INET garantit que la connexion fonctionne correctement.Cygwin est auto-certes un énorme gâchis pour la programmation socket, mais il est un cas réel du monde où AF_INET et PF_INET ne sont pas identiques.
la source
#define PF_INET AF_INET
chez Cygwinsocket.h
.La vérification du fichier d'en-tête résout le problème. On peut y rechercher le compilateur système.
Pour mon système, AF_INET == PF_INET
AF == Famille d'adresse et PF == Famille de protocole
Familles de protocole, comme les familles d'adresses.
la source
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h