GNU/Linux >> Tutoriales Linux >  >> Linux

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

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 protocolo (familias) y los tipos de dirección específicos que cada uno podía usar. Se imaginó que una familia de protocolos puede 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 se ocupan 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_ simplemente se definieron por el identificador de protocolo correspondiente, lo que hace que la distinción entre constantes AF_ y PF_ sea un argumento técnico sin consecuencias prácticas significativas. De hecho, existe mucha confusión en el uso correcto de ambas formas.


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

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

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

En alguna documentación, verá la mención de un "PF_INET" místico. 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í. Una vez, 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, puede usar AF_INET en todas partes. Y, dado que eso es lo que W. Richard Stevens hace en su libro, eso es lo que haré aquí.


  • AF =Dirección de la familia
  • PF =Familia de protocolos

Significado, AF_INET se refiere a direcciones de Internet, direcciones IP específicamente. PF_INET se refiere a cualquier cosa en el protocolo, generalmente sockets/puertos.

Considere leer las páginas man para socket(2) y bind(2). Para el sin_addr campo, simplemente haga algo como lo siguiente para configurarlo:

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

Linux
  1. ¿Cuál es la diferencia entre InnoDB y MyISAM?

  2. ¿Cuál es la diferencia entre strtok_r y strtok_s en C?

  3. ¿Cuál es la diferencia entre adduser y useradd?

  4. ¿Cuál es la diferencia entre `su -` y `su --login`?

  5. ¿Cuál es la diferencia entre unlink y rm?

¿Cuál es la diferencia entre Linux y Unix?

¿Cuál es la diferencia entre Shell de inicio de sesión y sin inicio de sesión?

¿Cuál es la diferencia entre el comando apt y apt-get?

¿Qué es un Hipervisor? ¿Cuál es la diferencia entre el tipo 1 y 2?

¿Cuál es la diferencia entre curl y Wget?

¿Cuál es la diferencia entre ruta y ruta ip?