एक 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 */
}
/* ... */
प्रदान की कड़ी है यूनिक्स और इंटरनेट सॉकेट –