문제

모든 도구 (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');
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top