sockaddr_in sockaddr inet_aton inaddr_any c linux sockets

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.