2012-06-12 56 views
14

Bất kỳ ai có thể mô tả cách (struct sockaddr *)&server hoạt động ở đây như thế nào? Có thể đúc cấu trúc lớn hơn để cấu trúc nhỏ hơn?Có thể tạo cấu trúc cho cấu trúc khác không?

Xem những cấu trúc:

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

Đây là chương trình chính:

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://stackoverflow.com/questions/3995940/casting-one-c-structure-into-another || http://stackoverflow.com/questions/3766229/casting-one-struct-pointer-to-other-c –

Trả lời

10

này đều được quy như Type Punning. Ở đây, cả hai cấu trúc đều có cùng kích thước, do đó không có câu hỏi về kích thước struct. Mặc dù bạn có thể cast hầu như bất cứ điều gì để bất cứ điều gì, làm nó với cấu trúc là dễ bị lỗi.

+0

Làm thế nào các hàm connect() có thể truy cập vào inet_address được lưu trữ trong 'struct in_addr'? –

+0

Giống như '((struct sockaddr_in *) server-> sin_addr.s_addr)' – Benoit

+0

printf ("addr:% d \ n", ((struct sockaddr_in *) server-> sin_addr.s_addr)); sẽ tạo ra lỗi này: socket.c: 50: 54: error: đối số kiểu không hợp lệ của ‘->’ (có ‘struct sockaddr_in’) tại sao? –

3

Bạn có thể truyền sockaddr_in vào sockaddr, nhưng bạn không thể truyền bất kỳ cấu trúc nào cho BẤT CỨ khác và giả định rằng mọi thứ sẽ hoạt động bình thường.

6

Đây là dạng "thừa kế" của C (lưu ý các dấu ngoặc kép). Điều này hoạt động vì C không quan tâm đến dữ liệu cơ bản trong một địa chỉ, chỉ là những gì bạn đại diện cho nó.

Hàm xác định cấu trúc thực sự là gì bằng cách sử dụng trường sa_family và đưa nó vào đúng sockaddr_in bên trong hàm.

1

Trong C, bạn có thể truyền bất kỳ thứ gì cho bất kỳ thứ gì. Bạn thậm chí có thể bỏ qua các diễn viên để (struct sockaddr *), và có lẽ chỉ nhận được một cảnh báo trình biên dịch.

Các vấn đề liên quan