¿Cuál es la diferencia entre AF_INET y PF_INET en la programación de sockets?

Resuelto SP Sandhu asked hace 13 años • 7 respuestas

¿Cuál es la diferencia entre AF_INET y PF_INET en la programación de sockets?

Estoy confundido entre usar AF_INET y PF_INET en socket()y bind().

Además, ¿cómo dar la dirección IP en el sin_addrcampo?

SP Sandhu avatar Jul 18 '11 13:07 SP Sandhu
Aceptado

La famosa guía de programación de redes de Beej ofrece una buena explicación:

En alguna documentación, verá una mención de un místico "PF_INET". Esta es una extraña bestia etérea que rara vez se ve en la naturaleza, pero también podría aclararlo un poco aquí. Hace mucho tiempo, se pensó que tal vez una familia de direcciones (lo que significa "AF" en "AF_INET") podría admitir varios protocolos a los que hacía referencia su familia de protocolos (lo que significa "PF" en "PF_INET" ).
Eso no sucedió. Oh bien. Entonces, lo correcto es usar AF_INET en su estructura sockaddr_in y PF_INET en su llamada a socket(). Pero en la práctica, puedes usar AF_INET en todas partes. Y, dado que eso es lo que hace W. Richard Stevens en su libro, eso es lo que haré aquí.

Damon avatar Jul 18 '2011 18:07 Damon

Encontré en el código fuente del kernel de Linux que PF_INET y AF_INET son iguales. El siguiente código proviene del archivo include/linux/socket.h , línea 204 del árbol del kernel de Linux 3.2.21.

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET
Duke avatar Aug 11 '2012 12:08 Duke
  • AF = Familia de direcciones
  • PF = Familia de protocolos

Es decir, AF_INETse refiere a direcciones de Internet, específicamente direcciones IP. PF_INETse refiere a cualquier cosa en el protocolo, generalmente sockets/puertos.

Considere leer las páginas del manual de socket(2) y bind(2) . Para el sin_addrcampo, simplemente haga algo como lo siguiente para configurarlo:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 
codemac avatar Jul 18 '2011 06:07 codemac

De hecho, AF_ y PF_ son lo mismo. Hay algunas palabras en Wikipedia que aclararán tu confusión.

El concepto de diseño original de la interfaz de socket distinguía entre tipos de protocolos (familias) y los tipos de direcciones específicos que cada uno puede utilizar. Se previó que una familia de protocolos pudiera tener varios tipos de direcciones. Los tipos de direcciones se definieron mediante constantes simbólicas adicionales, utilizando el prefijo AF_ en lugar de PF_. Los identificadores AF_ están destinados a todas las estructuras de datos que tratan específicamente del tipo de dirección y no de la familia de protocolos. Sin embargo, este concepto de separación de protocolo y tipo de dirección no ha encontrado soporte de implementación y las constantes AF_ se definieron simplemente mediante el identificador de protocolo correspondiente, lo que hace que la distinción entre constantes AF_ versus PF_ sea un argumento técnico sin consecuencias prácticas significativas. De hecho, existe mucha confusión en el uso adecuado de ambas formas.

firo avatar Feb 22 '2013 09:02 firo