2012-06-12 12 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://stackoverflow.com/questions/3995940/casting-one-c- संरचना-into-another || http://stackoverflow.com/questions/3766229/casting-one-struct-pointer-to-other-c –

उत्तर

10

यह Type Punning के रूप में संदर्भित किया जाता है

इन structs देखें। यहां, दोनों संरचनाओं का एक ही आकार है, इसलिए संरचना आकार का कोई प्रश्न नहीं है। यद्यपि आप कुछ भी किसी भी चीज को कास्ट कर सकते हैं, संरचनाओं के साथ ऐसा करना त्रुटि-प्रवण है।

+0

'struct in_addr' में संग्रहीत inet_address में कनेक्ट() फ़ंक्शन कैसे एक्सेस कर सकते हैं? –

+0

कुछ ('स्ट्रक्चर sockaddr_in *) सर्वर-> sin_addr.s_addr)' – Benoit

+0

printf ("addr:% d \ n", ((स्ट्रक्चर sockaddr_in *) सर्वर-> sin_addr.s_addr) की तरह कुछ; इस त्रुटि का उत्पादन करेगा: socket.c: 50: 54: त्रुटि: अमान्य प्रकार तर्क '->' ('struct sockaddr_in' है) क्यों? –

3

आप sockaddr_in को sockaddr में डाल सकते हैं, लेकिन आप आमतौर पर किसी भी अन्य संरचना को किसी अन्य पर नहीं डाल सकते हैं और मानते हैं कि चीजें ठीक से काम करती हैं।

6

यह सी "विरासत" का रूप है (उद्धरण नोटिस)। यह काम करता है क्योंकि सी किसी पते में अंतर्निहित डेटा के बारे में परवाह नहीं करता है, बस आप इसका प्रतिनिधित्व करते हैं।

फ़ंक्शन यह निर्धारित करता है कि यह वास्तव में sa_family फ़ील्ड का उपयोग करके कौन सी संरचना है, और इसे फ़ंक्शन के अंदर उचित sockaddr_in में कास्ट करना है।

1

सी में, कुछ भी कुछ भी करना संभव है। आप कलाकारों को भी (संरचना sockaddr *) को छोड़ सकते हैं, और शायद बस एक कंपाइलर चेतावनी प्राप्त करें।