Nếu tôi sử dụng wget
để lấy một cái gì đó từ máy chủ geonames.org, nó báo cáo hai địa chỉ IP, và là người đầu tiên thất bại nhưng nó được nó từ thứ hai:Làm thế nào để thất bại trên
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
Nhưng tiếc là tôi phải truy cập thông qua perl bằng cách sử dụng LWP :: UserAgent và HTTP :: Request. Làm thế nào tôi có thể làm cho họ thử IP thứ hai nếu lần đầu tiên không thành công?
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);
Bạn có chắc chắn rằng đây không phải là hành vi mặc định cho LWP :: UserAgent? Sau khi đào qua mã LWP :: UserAgent ngày hôm nay, nó sẽ xuất hiện khi socket đang được kết nối sâu bên trong IO :: Socket :: INET :: configure() nó sẽ thử tất cả các địa chỉ IP được trả về cho một hostname và sẽ giải quyết cho IP đầu tiên mà nó có thể kết nối tới. –
@RobWells, vấn đề là có sự khác biệt giữa "có thể mở một ổ cắm" và "nhận được phản hồi HTTP hợp lệ trong thời gian chờ". 'wget' sẽ chuyển sang phần tiếp theo nếu phần thứ hai thất bại, nhưng' LWP :: UserAgent' thì không. –
cổ vũ @Paul. Tôi đã thấy rằng bạn phải kích hoạt một cách rõ ràng tùy chọn MultiHome để có được hành vi đó lặp trên nhiều IP. Nó bị chôn vùi trong tình trạng hỗn loạn của Perl OO -> SUPER :: foo nên thật vui khi theo dõi! (-: –