2011-02-24 16 views
14

मैं सी ++ में बूस्ट एएसओ प्रोग्रामिंग के साथ शुरू कर रहा हूं और उदाहरणों को देखते समय मैं समझ नहीं पा रहा हूं कि boost::asio::ip::tcp::resolver::iterator क्या करता है।बढ़ावा देता है :: asio :: ip :: tcp :: resolver :: iterator क्या करता है?

कोड:

boost::asio::io_service io_service; 

tcp::resolver resolver(io_service); 
tcp::resolver::query query(argv[1]); 
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
tcp::resolver::iterator end; 

tcp::socket socket(io_service); 
boost::system::error_code error = boost::asio::error::host_not_found; 
while (error && endpoint_iterator != end) 
{ 
    socket.close(); 
    socket.connect(*endpoint_iterator++, error); 
} 

कृपया मेरी मदद करो और मुझे क्षमा मेरे सवाल का पर्याप्त जानकारी प्रदान नहीं करता है।

+2

boost.asio नामस्थान से प्यार होना चाहिए। * बार्फ़ * – Inverse

+0

एफवाईआई: क्वेरी केवल एक सेवा के लिए है। यदि आप किसी विशिष्ट होस्ट fpr को किसी सेवा की तलाश में हैं, तो आपको tcp :: resolver :: query ctor में एक और पैरामीटर जोड़ना होगा। –

उत्तर

19

boost::asio::ip::tcp::resolver::iterator आपके द्वारा निर्दिष्ट होस्ट की पता सूची के माध्यम से पुनरावृत्त करता है (होस्ट एकाधिक पते हो सकते हैं)।

एक std :: string :: iterator अपने पात्रों के माध्यम से पुनरावृत्त करता है, boost :: asio :: ip :: tcp :: resolver :: iterator इसकी पता सूची के माध्यम से पुनरावृत्त करता है।

निम्नलिखित कोड:

while (error && endpoint_iterator != end) 
{ 
    socket.close(); 
    socket.connect(*endpoint_iterator++, error); 
} 

प्रत्येक समाप्ति बिंदु को एक कनेक्शन स्थापित करने के लिए जब तक यह सफल होता है या अंतिम बिंदु से बाहर चलाता प्रयास कर रहा है (सुधार यूजेन Constantin Dinca के लिए धन्यवाद)।

+2

असल में 'while' प्रत्येक समापन बिंदु से कनेक्ट होने का प्रयास करता है जब तक कि यह सफल न हो या यह अंतराल से बाहर हो जाए। इसलिए लूप के अंत में अधिकांश 1 एंडपॉइंट कनेक्ट हो जाएंगे। –

+0

एंडपॉइंट_इटरेटर ++ के बजाय * endpoint_iterator ++ का उपयोग क्यों करता है? आपको पॉइंटर्स की आवश्यकता क्यों होगी? – Hami

+5

@ हामी 'आईपी :: टीसीपी :: रिज़ॉल्वर :: इटेटरेटर पॉइंटर नहीं है, यह सिर्फ एक जैसा दिखता है और व्यवहार करता है। पोस्टफिक्स वृद्धि ऑपरेटर ('ऑपरेटर ++ (int)') अगले इटरेटर ** ** के बाद इंडिकेशन ऑपरेटर ('ऑपरेटर *()') अंतर्निहित 'एंडपॉइंट' प्राप्त करता है और इसे 'सॉकेट :: कनेक्ट() ' । यदि कनेक्शन विफल रहता है, तो 'त्रुटि' सेट होती है और लूप जारी रहता है। ये मानक टेम्पलेट लाइब्रेरी में इटरेटर्स द्वारा उपयोग की जाने वाली वही अवधारणाएं हैं। –

संबंधित मुद्दे