Perl 소켓은 Linux에서 호스트 이름을 어떻게 해결합니까?
문제
모든 도구 (NSLOOKUP, CURL, WGET, FIREFOX 등)가 주소를 해결할 수있는 (Ubuntu 8.04) 완벽하게 작동하는 Linux 설정 (Ubuntu 8.04)이 있습니다. 그러나 다음 코드는 실패합니다.
$s = new IO::Socket::INET(
PeerAddr => 'stackoverflow.com',
PeerPort => 80,
Proto => 'tcp',
);
die "Error: $!\n" unless $s;
나는 다음과 같은 것을 확인했다.
Perl은 gethostbyname으로 주소를 해결할 수 있습니다 (예 : 아래 코드는 작품) :
my $ret = gethostbyname('stackoverflow.com'); print inet_ntoa($ret);
원래 소스 코드는 Windows에서 작동합니다
- LWP 가이 동작을 사용하려고 시도하기 때문에 이것이 작동하는 방식 (즉, 호스트 이름을 해결해야합니다)입니다.
- 스크립트를 실행해도 DNS 요청이 방출되지 않으므로 이름을 해결하려고 시도조차하지 않습니다). Wireshark로 확인
해결책
빠른 모양에서 io :: socket :: inet의 다음 코드
sub _get_addr {
my($sock,$addr_str, $multi) = @_;
my @addr;
if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) {
(undef, undef, undef, undef, @addr) = gethostbyname($addr_str);
} else {
my $h = inet_aton($addr_str);
push(@addr, $h) if defined $h;
}
@addr;
}
(이 코드의 발신자를 보면) 추가 작업을 제안합니다. MultiHomed => 1,
코드에.
그 해결책이 없으면 위의 코드는 전화를 시도하는 것으로 보입니다. inet_aton("hostname.com")
socket.pm에서 inet_aton ()을 사용합니다. 그것은 Win32와 Unix 모두에서 저에게 효과적입니다. 그래서 나는 그것이 당신을 위해 파손이있는 곳이라고 생각합니다.
보다 socket.xs inet_aton의 소스 코드 :
void
inet_aton(host)
char * host
CODE:
{
struct in_addr ip_address;
struct hostent * phe;
if (phe = gethostbyname(host)) {
Copy( phe->h_addr, &ip_address, phe->h_length, char );
} else {
ip_address.s_addr = inet_addr(host);
}
ST(0) = sv_newmortal();
if(ip_address.s_addr != INADDR_NONE) {
sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
}
}
Perl GethostbyName ()는 C GethostbyName ()보다 더 잘 작동하는 것으로 보입니다.
다른 팁
아마도 우리에게 정확히 말해 주시겠습니까? 어떻게 코드가 실패합니까? 오류 확인 코드가 있지만 오류가 무엇인지보고하지 않았습니다!
방금 원래 코드를 사용해 보았습니다 (Mac OS X 시스템에 "IO :: Socket :: inet 사용"을 추가하여 제대로 작동합니다.
멀티 하이머스 옵션이 불필요한 해킹이고 다른 문제는 문제의 근본 원인이라고 생각합니다.
진술이 있는지 확인하십시오
use IO::Socket::INET;
소스 코드의 시작 부분에서. 이것을 떠나면 아마도 오류 메시지를 받고있을 것입니다.
패키지를 통해 "새"객체 메소드를 찾을 수 없습니다 "io :: socket :: inet"
그 외에도 DNS가 Net :: DNS :: Resoler를 사용하여 작업하고 있는지 확인할 수 있습니다. 자세한 정보를 참조하십시오. 여기.
use Net::DNS;
my $res = Net::DNS::Resolver->new;
# Perform a lookup, using the searchlist if appropriate.
my $answer = $res->search('example.com');