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

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

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

Además, ¿cómo dar ip-address en el campo sin_addr ?

La famosa guía de progtwigción en red de Beej da una buena explicación:

En cierta documentación, verá 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í. 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 su familia de protocolos hacía referencia (lo que significa el “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 hablando en términos prácticos, puedes usar AF_INET en todas partes. Y, como eso es lo que W. Richard Stevens hace en su libro, eso es lo que haré aquí.

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

 /* Protocol families, same as address families. */ ... #define PF_INET AF_INET 
  • AF = Dirección familia
  • PF = familia de protocolo

Es decir, AF_INET refiere a las direcciones de internet, direcciones IP específicamente. PF_INET refiere a cualquier cosa en el protocolo, generalmente sockets / ports.

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

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

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

El concepto de diseño original de la interfaz de socket distingue entre los tipos de protocolos (familias) y los tipos de direcciones específicos que cada uno puede usar. Se previó que una familia de protocolos puede tener varios tipos de direcciones. Los tipos de direcciones se definieron mediante constantes simbólicas adicionales, usando 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 para la implementación y las constantes AF simplemente se definieron por el correspondiente identificador de protocolo, haciendo que la distinción entre AF_ contra constantes PF_ sea un argumento técnico sin consecuencias prácticas significativas. De hecho, existe mucha confusión en el uso correcto de ambas formas.

AF_INET = Formato de dirección, Internet = Direcciones IP

PF_INET = Formato de paquete, Internet = IP, TCP / IP o UDP / IP

AF_INET es la familia de direcciones que se utiliza para el socket que está creando (en este caso, una dirección de Protocolo de Internet). El kernel de Linux, por ejemplo, admite otras 29 familias de direcciones como sockets UNIX e IPX, y también las comunicaciones con IRDA y Bluetooth (AF_IRDA y AF_BLUETOOTH, pero es dudoso que las use en un nivel tan bajo).

En su mayor parte, apegarse a AF_INET para la progtwigción del socket a través de una red es la opción más segura.

Es decir, AF_INET se refiere a las direcciones de internet, direcciones IP específicamente.

PF_INET se refiere a cualquier cosa en el protocolo, generalmente sockets / ports.

Hay situaciones en las que importa.

Si pasa AF_INET a socket() en Cygwin, su socket puede o no ser reiniciado aleatoriamente. Pasar PF_INET asegura que la conexión funciona correctamente.

Cygwin es sin dudas un gran desastre para la progtwigción de socket, pero es un caso del mundo real donde AF_INET y PF_INET no son idénticos.