¿Por qué sin_addr está dentro de la estructura in_addr?

4 minutos de lectura

avatar de usuario
Deepankar Bajpeyi

Mi duda está relacionada con la siguiente estructura de sockets en UNIX:

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

Aquí el miembro sin_addr es de tipo struct in_addr.

Pero no entiendo por qué a alguien le gustaría hacer eso como todo struct inaddr tiene se :

struct in_addr {
    unsigned long s_addr;          // load with inet_pton()
};

Todos in_addr tiene es solo un miembro s_addr. ¿Por qué no podemos tener algo como esto:

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    unsigned long    s_addr ; 
    char             sin_zero[8];  // zero this if you want to
};

  • Incluso te sugiero que leas este si quieres saber más sobre toda la familia!

    – cmc

    20 de diciembre de 2012 a las 19:56

  • Esta es una pregunta puntual que TODOS se preguntan una o más veces. Las razones se reducen a las razones para usar estructuras (e incluso uniones) en el uso clásico del mundo real de C, donde los casos de uso específicos o las implementaciones de la plataforma pueden variar los detalles pero aun así casarse con la API.

    – uchuugaka

    20 de enero de 2015 a las 14:45

  • Lo que es interesante es que no he trabajado en esta área durante los últimos 2 años y he olvidado por qué pregunté esto. Sigue siendo mi pregunta más popular y probablemente haga que mucha gente se pregunte y profundice en el tema. Me encanta cómo funciona esta comunidad.

    – Deepankar Bajpeyi

    20 de enero de 2015 a las 16:57

  • Permitir versatilidad en la implementación.

    – Gabriel grapas

    12 de abril a las 1:17


avatar de usuario
carl norum

struct in_addr es a veces muy diferente a eso, dependiendo del sistema en el que se encuentre. En ventanas por ejemplo:

typedef struct in_addr {
  union {
    struct {
      u_char s_b1,s_b2,s_b3,s_b4;
    } S_un_b;
    struct {
      u_short s_w1,s_w2;
    } S_un_w;
    u_long S_addr;
  } S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

El único requisito es que contiene un miembro s_addr.

  • Más precisamente, que sin_addr.s_addr da como resultado un valor l de un tipo entero de 32 bits que representa la dirección. AFAIR también vi cosas como #define s_addr S_un.S_addr. Pero esto es algo extremadamente estúpido, o simplemente proviene de tiempos de lenguaje C realmente retrasado que no admitía uniones anónimas.

    – Ethuris

    31 de julio de 2015 a las 14:56

Porque el in_addr La estructura puede contener más de un miembro.

http://pubs.opengroup.org/onlinepubs/009604599/basedefs/netinet/in.h.html

  • Esto básicamente responde a todo lo que hay que responder. La razón struct in_addr existe es porque mayo ser más que un número entero.

    usuario308323

    20 de diciembre de 2012 a las 19:31


struct in_addr es más que un número entero es porque podría tener más de in_addr_t. En muchos sistemas, tiene un uniony la razón de tal implementación es para direcciones de clase A/B/Cque no se utilizan ahora.

Programación de red Unix Volumen 1 explica la razón histórica en detalle:

La razón por la que sin_addr miembro es una estructura, y no sólo un in_addr_t, es histórico. Versiones anteriores (4.2BSD) definieron el in_addr estructura como un
union de varias estructuras, para permitir el acceso a cada uno de los 4 bytes y a los dos valores de 16 bits contenidos en la dirección IPv4 de 32 bits. Esto se usó con direcciones de clase A, B y C para obtener los bytes apropiados de la dirección. Pero con el advenimiento de la división en subredes y luego la desaparición de las diversas clases de direcciones con direccionamiento sin clases, desapareció la necesidad de la unión. La mayoría de los sistemas actuales han eliminado la union y simplemente definir in_addr como una estructura con un solo in_addr_t miembro.

¿Ha sido útil esta solución?