2012-06-12 21 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

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

答えて

10

これはType Punningとして参照される

は、これらの構造体を参照してください。ここでは、両方の構造が同じサイズであるため、構造体サイズの問題はありません。ほとんどのものは何でもキャストすることができますが、構造を使って行うのは誤りがあります。

+0

connect()関数が 'struct in_addr'に格納されているinet_addressにアクセスする方法を教えてください。 –

+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:error:無効な型引数 ' - >'( 'struct sockaddr_in'を持っています)なぜですか? –

3

あなたはsockaddr_inをsockaddrにキャストすることができますが、普通はstructを他のものにキャストできず、正しく動作すると仮定します。

6

これはCの「継承」形式です(引用符に注意してください)。これは、Cがアドレス内の基になるデータを気にしないので、あなたがそれを表すように動作します。

この関数は、sa_familyフィールドを使用して関数内の適切なsockaddr_inにキャストすることで、実際にどのような構造になるかを決定します。

1

Cでは、何かに何かをキャストすることは可能です。あなたは(struct sockaddr *)へのキャストを省略することもでき、たぶんコンパイラの警告を得るだけです。

関連する問題