2010-09-11 22 views
24

संरचना सॉकडरसंरचना sockaddr_un से अलग है?संरचना sockaddr_un v/s sockaddr - सी (लिनक्स)

मुझे पता है कि हम सॉकेट पते पर सॉकेट बाध्य करने के लिए क्लाइंट-सर्वर मॉड्यूल में इन संरचनाओं का उपयोग करते हैं। और हम संरचना sockaddr_un को स्वीकार करने के लिए एक कास्ट ऑपरेटर का उपयोग करते हैं।

मैं जानना चाहता हूं कि वे कितने अलग/समान हैं, और कास्ट ऑपरेटर क्यों?

उत्तर

23

"स्ट्रक्चर सॉकड्रर" एक सामान्य परिभाषा है। इसका उपयोग किसी भी सॉकेट फ़ंक्शन द्वारा किया जाता है जिसके लिए एक पता की आवश्यकता होती है।

"संरचना sockaddr_un" (एक "यूनिक्स सॉकेट" पता) एक विशिष्ट प्रकार का पता परिवार है।

अधिक सामान्य रूप से देखा गया "संरचना सॉकड्रर_इन" (एक "इंटरनेट सॉकेट" पता) एक और विशिष्ट प्रकार का पता परिवार है।

कलाकारों को सॉकेट एपीआई को एक सामान्य पैरामीटर प्रकार स्वीकार करने की अनुमति देता है जो वास्तव में कई अलग-अलग वास्तविक प्रकारों में से एक होगा।

http://www.cas.mcmaster.ca/~qiao/courses/cs3mh3/tutorials/socket.html

+0

प्रदान की कड़ी है यूनिक्स और इंटरनेट सॉकेट –

19

एक struct sockaddr आम तौर पर केवल एक सूचक के लिए आधार प्रकार के रूप में इस्तेमाल किया जाना चाहिए:

यहाँ एक अच्छा लिंक है कि कई अलग अलग पते के परिवार परिभाषाओं से पता चलता है। यह एक संरचना का पता परिवार विशिष्ट सॉकेट पते के प्रकार में सदस्य (struct sockaddr_un, struct sockaddr_in, struct sockaddr_in6 आदि)

केवल सदस्य के आम प्रारंभिक अनुक्रम है कि आप struct sockaddr पर भरोसा कर सकते हो रही एक भी sa_family_t है कवर करने के उद्देश्य है, सॉकेट पता परिवार का संकेत है। विचार यह है कि बहुरूपता का एक प्रकार प्राप्त करने के लिए है - आप एक समारोह है कि कई अलग अलग सॉकेट पते के प्रकार पर काम कर सकते हैं हो सकता है:

void foo(struct sockaddr *sa) 
{ 
    switch(sa->sa_family) 
    { 
    case AF_INET: { 
     struct sockaddr_in *sa_in = (struct sockaddr_in *)sa; 

     /* AF_INET processing */ 
    } 

    case AF_UNIX: { 
     struct sockaddr_un *sa_un = (struct sockaddr_un *)sa; 

     /* AF_UNIX processing */ 
    } 

/* ... */ 

नोट ही उपरोक्त की तरह है कि कोड आम तौर पर "सख्त अलियासिंग" तोड़ने के लिए माना जाता है - सी में शासन करता है, तो आपको बस इतना करना है कि अपने खुद के कोड में चाहते हैं, आप एक संघ प्रकार का उपयोग करने वाले हैं:

union sockaddr { 
    struct sockaddr sa; 
    struct sockaddr_in sin; 
    struct sockaddr_un sun; 
    /* ... */ 
}; 

void foo(union sockaddr *sa_union) 
{ 
    struct sockaddr *sa = (struct sockaddr *)sa_union; 

    switch(sa->sa_family) 
    { 
    case AF_INET: { 
     struct sockaddr_in *sa_in = (struct sockaddr_in *)sa; 

     /* AF_INET processing */ 
    } 

    case AF_UNIX: { 
     struct sockaddr_un *sa_un = (struct sockaddr_un *)sa; 

     /* AF_UNIX processing */ 
    } 

/* ... */ 
+1

@ CAF में अंतर के लिए स्पष्ट विचार देता है - धन्यवाद – Pavitar