[Duda] Estructuras sockaddr_in y sockaddr

Iniciado por r1ghtz0, Octubre 02, 2014, 07:56:01 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Octubre 02, 2014, 07:56:01 PM Ultima modificación: Octubre 02, 2014, 11:28:36 PM por Expermicid
Buenas, en primer lugar les digo que no tengo bien claro lo que hacen o para qué sirven estas estructuras, he leído e investigado pero no consigo una explicación que me convenza y me aclare para que sirven o que hacen. Lo primero que les voy transmitir es lo que he entendido acerca de cada una de estas dos estructuras.

Vamos con la primera estructura, la struct sockaddr, esta es una estructura genérica y supuestamente define el dominio del socket, es decir, si el dominio va a ser AF_INET o AF_UNIX. Ahora lo que no entiendo es para qué son esos dos campos que tienen o que valor se les da a esos campos.
Código: c

struct sockaddr
{
   unsigned short sa_family;  /* familia de la dirección */
   char sa_data[14];          /* 14 bytes de la dirección del protocolo */ 
};

Vamos con la segunda estructura, la struct sockaddr_in, esta si la entiendo un poco más ya que especifica los parámetros del socket, la estructura TCP/IP es la estructura struct sockaddr_in, hasta aquí es todo lo que entiendo.
Código: c

struct sockaddr_in {
   short int sin_family;        /* 1.-Familia de la Dirección               */
   unsigned short int sin_port; /* 2.- Puerto                               */
   struct in_addr sin_addr;     
   unsigned char sin_zero[8];   /* 4.- Del mismo tamaño que struct sockaddr */
};


Ahora vamos el siguiente código:
Código: c

struct sockaddr_in Direccion;
Direccion.sin_family = AF_INET;
Direccion.sin_port = Puerto->s_port;
Direccion.sin_addr.s_addr =INADDR_ANY;

if (bind (Descriptor, (struct sockaddr *)&Direccion, sizeof (Direccion)) == -1)
{
    printf ("Error\n");
}


Como es posible que el puntero &Dirección de tipo struct sockaddr_in se convierta a uno de struct sockaddr *, si struct sockaddr_in tiene 4 campos y struct sockaddr solo tiene 2 campos. Entonces ve lo que sucede? Un puntero de tipo estructura de 4 campos se convierte a un puntero de tipo estructura de 2 campos.