¿Es posible lanzar estructura a otro?

¿Alguien podría describir cómo (struct sockaddr *)&server funcionan aquí? ¿Es posible lanzar estructuras más grandes a estructuras más pequeñas?

Ver estas estructuras:

 // IPv4 AF_INET sockets: struct sockaddr_in { short sin_family; // eg AF_INET, AF_INET6 unsigned short sin_port; // eg htons(3490) struct in_addr sin_addr; // see struct in_addr, below char sin_zero[8]; // zero this if you want to }; struct in_addr { unsigned long s_addr; // load with inet_pton() }; struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address }; 

Este es el progtwig principal:

 int main(int argc , char *argv[]) { int socket_desc; struct sockaddr_in server; //Create socket socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { printf("Could not create socket"); } server.sin_addr.s_addr = inet_addr("74.125.235.20"); server.sin_family = AF_INET; server.sin_port = htons( 80 ); //Connect to remote server if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0) { puts("connect error"); return 1; } puts("Connected"); return 0; } 

Esto se conoce como Tipo Punning . Aquí, ambas estructuras tienen el mismo tamaño, por lo que no hay duda del tamaño de la estructura. Aunque puedes lanzar casi cualquier cosa a cualquier cosa, hacerlo con estructuras es propenso a errores.

Esta es la forma de “herencia” de C (observe las comillas). Esto funciona porque a C no le importan los datos subyacentes en una dirección, solo como los representa.

La función determina qué estructura es en realidad usando el campo sa_family, y convirtiéndolo en el sockaddr_in apropiado dentro de la función.

Puedes lanzar sockaddr_in a sockaddr, pero normalmente no puedes lanzar CUALQUIER estructura a CUALQUIER otra y asumir que las cosas funcionarán correctamente.

En C, es posible lanzar cualquier cosa a cualquier cosa. Incluso podría omitir el lanzamiento a (struct sockaddr *), y probablemente solo obtenga una advertencia del comstackdor.