2012-06-12 4 views
14

Любое могло бы описать, как работает (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; 
} 
+0

http://www.stackoverflow.com/questions/3995940/casting-one-c-structure-into-another || http://stackoverflow.com/questions/3766229/casting-one-struct-pointer-to-other-c –

ответ

10

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

+0

Как функции connect() могут получить доступ к inet_address, который хранится в 'struct in_addr'? –

+0

Что-то вроде '((struct sockaddr_in *) server-> sin_addr.s_addr)' – Benoit

+0

printf ("addr:% d \ n", ((struct sockaddr_in *) server-> sin_addr.s_addr)); приведет к этой ошибке: socket.c: 50: 54: ошибка: неверный аргумент типа '->' (есть 'struct sockaddr_in') почему? –

3

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

6

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

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

1

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

Смежные вопросы