¿Es posible enviar una estructura a otra?

Cualquiera podría describir cómo (struct sockaddr *)&server trabaja aquí? ¿Es posible convertir una estructura más grande en una estructura más pequeña?

Vea estas estructuras:

// IPv4 AF_INET sockets:
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
};

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 programa 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;
}

preguntado el 12 de junio de 12 a las 15:06

4 Respuestas

Esto se conoce como Tipo de juego de palabras. Aquí, ambas estructuras tienen el mismo tamaño, por lo que no hay dudas sobre el tamaño de la estructura. Aunque puede convertir casi cualquier cosa en cualquier cosa, hacerlo con estructuras es propenso a errores.

Respondido 19 Jul 12, 09:07

Cómo las funciones connect() pueden acceder a inet_address que está almacenada en struct in_addr? - milad jajavi

Algo como ((struct sockaddr_in *) server->sin_addr.s_addr) - Benoit

printf ("addr: %d\n",((struct sockaddr_in *) server->sin_addr.s_addr)); producirá este error: socket.c:50:54: error: argumento de tipo no válido de '->' (tiene 'struct sockaddr_in') ¿por qué? - milad jajavi

Mi problema está resuelto. Gracias. ((struct sockaddr_in *) servidor)->sin_addr.s_addr - milad jajavi

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 cómo los representas.

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

Respondido el 12 de junio de 12 a las 15:06

Puede convertir sockaddr_in en sockaddr, pero normalmente no puede convertir CUALQUIER estructura en CUALQUIER otra y asumir que las cosas funcionarán correctamente.

Respondido el 12 de junio de 12 a las 15:06

En C, es posible convertir cualquier cosa en cualquier cosa. Incluso podría omitir la conversión a (struct sockaddr*), y probablemente solo reciba una advertencia del compilador.

Respondido el 12 de junio de 12 a las 15:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.