Можно ли привести структуру к другому?

Любой мог бы описать, как(struct sockaddr *)&server здесь работает? Можно ли привести большую структуру к меньшей структуре?

Смотрите эти структуры:

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

Это основная программа:

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

Ответы на вопрос(4)

В C можно привести что угодно к чему угодно. Вы можете даже опустить приведение к (struct sockaddr *) и, возможно, просто получить предупреждение компилятора.

Решение Вопроса

Это упоминается какТип Паннинг, Здесь обе структуры имеют одинаковый размер, поэтому не возникает вопроса о размере структуры. Несмотря на то, что вы можете приводить почти все к чему угодно, выполнение со структурами подвержено ошибкам.

 Milad Khajavi12 июн. 2012 г., 18:58
Моя проблема решена. Благодарю. ((struct sockaddr_in *) сервер) - & gt; sin_addr.s_addr
 Milad Khajavi12 июн. 2012 г., 18:37
printf (& quot; адрес:% d \ n & quot;, ((struct sockaddr_in *) server- & gt; sin_addr.s_addr)); выдаст эту ошибку: socket.c: 50: 54: ошибка: неверный аргумент типа & # x2018; - & gt; & # x2019; (есть & # x2018; struct sockaddr_in & # x2019;) почему?
 12 июн. 2012 г., 17:26
Что-то вроде((struct sockaddr_in *) server->sin_addr.s_addr)
 Milad Khajavi12 июн. 2012 г., 17:03
Как функции connect () могут получить доступ к inet_address, который хранится вstruct in_addr?

Это C-форма "наследования". (обратите внимание на цитаты). Это работает, потому что C не заботится о базовых данных в адресе, а только о том, как вы их представляете.

Функция определяет, какой она на самом деле является структурой, используя поле sa_family и приводя его кsockaddr_in внутри функции.

Вы можете привести sockaddr_in к sockaddr, но обычно вы не можете привести ЛЮБУЮ структуру к ЛЮБОМУ другому и предполагать, что все будет работать правильно.

Ваш ответ на вопрос