2011-02-24 22 views
14

C++ 'da yükseltmeli programlama ile başlıyorum ve örneklere baktığımda sadece boost::asio::ip::tcp::resolver::iterator'un ne yaptığını anlayamıyorum.Boost :: asio :: ip :: tcp :: resolver :: iterator ne yapar?

Kodu:

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); 
} 

bana yardım ve benim sorum yeterli bilgi sağlamaz lütfen beni affedin.

+2

Boost.asio ad alanlarına bayılıyorum. * barf * – Inverse

+0

FYI: sorgu yalnızca bir hizmet içindir. Belirli bir ana bilgisayar hizmetini arıyorsanız, tcp :: resolver :: query ctor'una başka bir parametre eklemeniz gerekir. –

cevap

19

boost::asio::ip::tcp::resolver::iterator, belirttiğiniz ana bilgisayarın adres listesinde yinelenir (ana bilgisayarların birden çok adresi olabilir).

Bir std :: string :: yineleyicisi, karakterleri boyunca yinelenir, boost :: asio :: ip :: tcp :: resolver :: yineleyici, adres listesi boyunca yineleme yapar.

Aşağıdaki kod:

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

Başarılı veya uç noktalarını bitene kadar her bitiş noktasına bağlantı kurmak için çalışıyor (düzeltme Eugen Constantin Dinca için teşekkür ederim).

+2

Aslında 'while', her bir uç noktaya başarılı olana kadar veya uç noktalardan çıkana kadar bağlanmaya çalışır. Böylece, en sonunda 1 uç nokta döngü sonunda bağlanır. –

+0

Neden endpoint_iterator ++ yerine endpoint_iterator ++ kullanıyorsunuz? Neden işaretçiye ihtiyacınız var? – Hami

+5

@Hami 'ip :: tcp :: resolver :: iterator' bir işaretçi değil, sadece görünüyor ve bir gibi davranıyor. Postfix artım operatörü ('operator ++ (int)') bir sonraki yineleyiciyi (**) ** sonra indirgeyici operatör ('operator *()') temeldeki 'son noktayı' alır ve 'socket :: connect() 'öğesine döndürür. . Bağlantı başarısız olursa, 'error' ayarlanır ve döngü devam eder. Bunlar, Standart Şablon Kitaplığı'nda yineleyiciler tarafından kullanılan aynı kavramlardır. –

İlgili konular