Jeśli używam wget
odzyskać coś z serwera geonames.org, zgłasza dwa adresy IP, a pierwszy z nich zawiedzie, ale robi to z drugiego:Jak awaryjnie
Resolving ws.geonames.org (ws.geonames.org)... 5.9.41.208, 176.9.107.169
Connecting to ws.geonames.org (ws.geonames.org)|5.9.41.208|:80... failed: Connection refused.
Connecting to ws.geonames.org (ws.geonames.org)|176.9.107.169|:80... connected.
HTTP request sent, awaiting response... 200 OK
Ale niestety musi uzyskać do niego dostęp poprzez perl za pomocą LWP :: UserAgent i HTTP :: Request. Jak mogę sprawić, by spróbowały drugiego adresu IP, jeśli pierwsza się nie powiedzie?
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(
GET =>
"http://ws.geonames.org/countrySubdivision?lat=$lat&lng=$long&radius=$radius&username=xyzzy");
my $res = $ua->request($req);
jesteś pewien, że nie jest to zachowanie domyślne dla LWP :: UserAgent Anyway? Po skopiowaniu kodu LWP :: UserAgent dzisiaj, wydaje się, że kiedy gniazdo strumieniowe jest podłączone głęboko w IO :: Socket :: INET :: configure(), spróbuje wszystkich adresów IP zwróconych dla danej nazwy hosta i będzie rozlicza się za pierwsze IP, z którym może się połączyć. –
@RobWells, problem polegał na tym, że istnieje różnica między "można otworzyć gniazdo" i "uzyskać prawidłową odpowiedź HTTP w czasie timeout". 'wget' przejdzie do następnego, jeśli druga część się nie powiedzie, ale' LWP :: UserAgent' nie. –
Pozdrawiam @Paul. Zauważyłem, że musisz wyraźnie włączyć opcję MultiHome, aby uzyskać takie zachowanie w pętli w wielu IP. Jest pochowany w bagnie Perla OO -> SUPER :: foo, więc wyśledzenie jest "zabawne"! (-: –