inet_aton - ¿Por qué lanzamos sockaddr_in a sockaddr cuando llamamos a bind()?
sockaddr_in c++ (2)
Esto se debe a que el enlace puede enlazar otros tipos de sockets que los conectores de IP, por ejemplo, los sockets de dominio Unix, que tienen sockaddr_un como su tipo. La dirección de un socket AF_INET tiene el host y el puerto como su dirección, mientras que un socket AF_UNIX tiene una ruta de sistema de archivos.
La función bind() acepta un puntero a sockaddr
, pero en todos los ejemplos que he visto, se usa una estructura sockaddr_in
su lugar, y se sockaddr
en sockaddr
:
struct sockaddr_in name;
...
if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
...
No puedo entender por qué se usa una estructura sockaddr_in
. ¿Por qué no solo preparar y pasar un sockaddr
?
¿Es solo una convención?
No, no es solo una convención.
sockaddr
es un descriptor genérico para cualquier tipo de operación de socket, mientras que sockaddr_in
es una estructura específica para la comunicación basada en IP (IIRC, "in" significa "InterNet"). Hasta donde yo sé, este es un tipo de "polimorfismo": la función bind()
pretende tomar una struct sockaddr *
, pero de hecho supondrá que se pasa el tipo apropiado de estructura; es decir, uno que corresponde al tipo de socket que le da como primer argumento.