2012-06-12 19 views
5

मैं localhost एक बार हर 5 सेकंड पर boost::asio::ip::tcp::resolver::resolve() लागू एक डिब्बा बंद प्रतिलिपि प्रस्तुत की है। यह वापस किए गए एंडपॉइंट्स की संख्या की गणना करता है और पिछले पुनरावृत्ति के विरुद्ध उस मान की तुलना करता है।परिणाम Boost.Asio समाधानकर्ता से अलग

#include <boost/asio.hpp> 

#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    if (argc < 3) { 
     std::cerr << argv[0] << " host port" << std::endl; 
     exit(EXIT_FAILURE); 
    } 
    const char* host = argv[1]; 
    const char* service = argv[2]; 

    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::resolver resolver(io_service); 

    size_t previous = 0; 
    while (true) { 
     boost::asio::ip::tcp::resolver::iterator i(
       resolver.resolve(
        boost::asio::ip::tcp::resolver::query(host, service) 
        ) 
       ); 
     size_t count(0); 
     while (i != boost::asio::ip::tcp::resolver::iterator()) { 
      std::cout << i->endpoint() << std::endl; 
      ++i; 
      ++count; 
     } 

     std::cout << "got " << count << " addresses" << std::endl; 
     if (previous == 0) { 
      previous = count; 
     } 
     assert(count == previous); 

     sleep(5); 
    } 
} 

नमूना सत्र

~> time ./addrinfo_asio localhost 80 

... 

127.0.0.1:80 
got 1 addresses 
[::1]:80 
127.0.0.1:80 
got 2 addresses 
addrinfo_asio: addrinfo_asio.cc:35: int main(int, char**): Assertion `count == previous' failed. 
Aborted (core dumped) 

real 216m20.515s 
user 0m0.181s 
sys  0m0.193s 
~> 

आप इसे लगभग 3.5 घंटे के लिए एक अंत बिंदु (127.0.0.1:80) में पाया गया, तो पाया देख सकते हैं दो (127.0.0.1:80 और [:: 1] : 80)। मुझे आश्चर्य है कि

  1. एंडपॉइंट गिनती एक से दो में क्यों बदलती है?
  2. इसका कारण क्या हो सकता है?

आईपीवी 4 और आईपीवी 6 पते दोनों को हल करना जानबूझकर है, मैं क्वेरी को केवल ipv4 तक सीमित नहीं करना चाहता हूं। मुझे एहसास है कि यह व्यवहार संभवतः एएसओ के लिए विशिष्ट नहीं है, मेरे पास एक प्रजननकर्ता भी getaddrinfo का आह्वान करता है जो एक ही व्यवहार को प्रदर्शित करता है। मेरा प्लेटफॉर्म पीपीसी 64 आरएचईएल 6.2 है यदि यह प्रासंगिक है। मैंने कहीं और पुन: उत्पन्न करने की कोशिश नहीं की है।

+0

':: 1' पता आईपीवी 6 लोकलहोस्ट पता है। शायद ओएस को यह महसूस करने में काफी समय लगता है कि आईपीवी 6 सक्षम है? –

+0

ओएस आप क्या चल रहे हैं? – gda2004

+0

@ gda2004 सवाल का अंतिम वाक्य देखते हैं, ppc64 RHEL 6.2 –

उत्तर

3

आप केवल आईपीवी 4 को समाधानकर्ता सीमित कर सकते हैं:
आईपी :: टीसीपी :: समाधानकर्ता :: क्वेरी (आईपी :: टीसीपी :: v4(), मेजबान, सेवा)

+1

AFAIU सवाल पतों getaddrinfo द्वारा दिया सीमित करने के लिए कैसे नहीं है, लेकिन क्यों IPv6 पता चलता अप के बाद कुछ समय अवधि समाप्त हो जाने। – Ralf

+0

खैर, मैं इस धारणा के तहत था कि विषय-स्टार्टर इस तथ्य से अनजान था कि उसकी रिज़ॉल्यूशन क्वेरी में आईपीवी 4 और आईपीवी 6 दोनों शामिल थे, इसलिए उन्हें * अवांछित * ipv6 प्रश्न मिले। दूसरी ओर, यह अच्छी तरह से जाना जाता है कि ipv6 DNS क्वेरी दर्दनाक धीमी हो सकती है ... –

+0

@IgorR। मुझे पता है कि ':: 1' पता 'ipv6-localhost' है, मैंने इसे प्रतिबिंबित करने के लिए अपना प्रश्न संपादित कर लिया है। मैं अपने संकल्प प्रश्नों को केवल ipv4 तक सीमित नहीं करना चाहता हूं। –

1

खैर मुझे कोई बढ़ावा विशेषज्ञ हूँ , लेकिन एक त्वरित ब्राउज़ मुझे बताता है कि यह डिफ़ॉल्ट रूप से AI_ADDRCONFIG का उपयोग कर रहा है (जो अच्छा है, इसे लगभग हमेशा इस्तेमाल किया जाना चाहिए)। उस ध्वज के साथ यह केवल IPv6 पते लौटाएगा यदि आपके पास कम से कम एक वैश्विक रूटेबल IPv6 पता कॉन्फ़िगर किया गया है। शायद आपका आईपीवी 6 कनेक्शन हमेशा उपलब्ध नहीं है?

+0

** विंडोज-विशिष्ट चेतावनी: ** AI_ADDRCONFIG स्थानीयहोस्ट विफल होने के लिए लुकअप का कारण बन सकता है। विवरण के लिए [बूस्ट टिकट 8503] (https://svn.boost.org/trac/boost/ticket/8503) देखें। –