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
};
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 union
y 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 unin_addr_t
, es histórico. Versiones anteriores (4.2BSD) definieron elin_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 launion
y simplemente definirin_addr
como una estructura con un soloin_addr_t
miembro.
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