2012-07-20 15 views
8

Beej's Simple Client उदाहरण कोड getaddrinfo() से लौटाए गए सभी आईपी पतों पर पुनरावृत्त होता है, जब तक कि यह पहले से कनेक्ट नहीं हो जाता। नीचे दिया गया कोड देखें।getaddrinfo() द्वारा दिए गए सभी पते से कनेक्ट करने का प्रयास करना आवश्यक है?

क्या यह हमेशा आवश्यक है, या यह मानना ​​ठीक है कि हमें केवल getaddrinfo() द्वारा लौटाए गए पहले पते से कनेक्ट करने का प्रयास करना है?

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 

if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    return 1; 
} 

// ------------------------------------------------------------ 
// loop through all the results and connect to the first we can 
for(p = servinfo; p != NULL; p = p->ai_next) { 
    if ((sockfd = socket(p->ai_family, p->ai_socktype, 
      p->ai_protocol)) == -1) { 
     perror("client: socket"); 
     continue; 
    } 

    if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { 
     close(sockfd); 
     perror("client: connect"); 
     continue; 
    } 

    break; 
} 

उत्तर

9

हां, आपको सभी पते पर फिर से शुरू करना चाहिए - विशेष रूप से, उस मामले पर विचार करें जब गंतव्य होस्ट में आईपीवी 6 पते सक्षम हैं लेकिन आपका स्थानीय होस्ट नहीं है। getaddrinfo()AF_INET6 पारिवारिक पते वापस करेगा, लेकिन फिर socket() या connect() कॉल विफल हो जाएगा।

यह भी एक संभावना है कि आपके मेजबान को लागू करने के लिए कई प्रोटोकॉल का समर्थन करता है है SOCK_STREAM (जैसे कि, टीसीपी के अलावा SCTP) और गंतव्य होस्ट नहीं करता है - जब से तुम संकेत संरचना के ai_protocol सदस्य सेट नहीं किया है, पते सभी प्रोटोकॉल का प्रतिनिधित्व SOCK_STREAM सॉकेट का समर्थन किया जाएगा।

0

मान लीजिए कि आप इस बिंदु पर सॉकेट के लिए नए हैं। हां, यह महत्वपूर्ण है क्योंकि getaddrinfo का उपयोग करने के बाद, आप आगे सत्यापन के लिए पता जानकारी पुनर्प्राप्त कर सकते हैं।

2

इस तरह से शीर्षक देखें ... सर्वर होस्ट जो आप कनेक्ट करना चाहते हैं उसके साथ जुड़े कई पते हो सकते हैं, लेकिन वास्तविक सर्वर प्रोग्राम केवल उन पते में से एक पर सुनता है। यदि आपका क्लाइंट सर्वर प्रोग्राम को सही पता नहीं जानता है, तो आपको मेजबान के सभी पतों को तब तक प्रयास करना होगा जब तक आप सही नहीं पाते और कनेक्ट कर सकें।

+0

या अधिक व्यावहारिक रूप से, मेजबान के पास एकाधिक पते क्यों हो सकते हैं? सबसे स्पष्ट उपयोग अनावश्यकता है। यदि पहला होस्ट जवाब नहीं देता है तो आप बेहतर सफलता प्राप्त कर सकते हैं यदि आप सूची में चलते हैं ... – asveikau

+0

@asveikau एक मेजबान के पास कई पते अलग-अलग कारण हो सकते हैं। यह अनावश्यकता के कारण हो सकता है, या हो सकता है कि यह दो अलग-अलग नेटवर्क, या अन्य कारणों की भीड़ हो। –

+0

रिडंडेंसी या लोड संतुलन। – Lothar

1

हां, आपको उन सभी के माध्यम से लूप करना चाहिए - इस बात की कोई गारंटी नहीं है कि पते के पहले (या जो भी आप उठाते हैं) वास्तव में मान्य होंगे। यही कारण है कि यह ट्यूटोरियल में ऐसा किया जाता है।

4

ऊपर दिए गए अन्य उत्तरों के अतिरिक्त, सामान्य मामले पर विचार करें कि बड़ी वेबसाइटों के लिए और इसी तरह, कई ए रिकॉर्ड अनावश्यक उद्देश्यों के लिए प्रकाशित किए जा सकते हैं। यदि पहले पते पर connect() विफल रहता है, तो आप दूसरों को भी आजमा सकते हैं।