The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


AnyEvent::DNS::EtcHosts - Use /etc/hosts before DNS


    use AnyEvent::DNS::EtcHosts;

    use AnyEvent::DNS;
    my $cv = AE::cv;
    AnyEvent::DNS::any '', sub {
        say foreach map { $_->[4] } grep { $_->[1] =~ /^(a|aaaa)$/ } @_;

    use AnyEvent::Socket;
    my $cv = AE::cv;
    AnyEvent::Socket::resolve_sockaddr $domain, $service, $proto, $family, undef, sub {
        say foreach map { format_address((AnyEvent::Socket::unpack_sockaddr($_->[3]))[1]) } @_;


AnyEvent::DNS::EtcHosts changes AnyEvent::DNS behavior. The /etc/hosts file is searched before DNS, so it is possible to override DNS entries.

The DNS lookups are emulated. This resolver returns the standard DNS reply based on /etc/hosts file rather than real DNS.

You can choose a different file by changing PERL_ANYEVENT_HOSTS environment variable.

This module also disables the original AnyEvent::Socket's helper function which reads /etc/hosts file after the DNS entry was not found. It prevents reading this file twice.

The AnyEvent::Socket resolver searches IPv4 and IPv6 addresses separately. If you don't want to check the addresses in DNS, both IPv4 and IPv6 addresses should be placed in /etc/hosts or the protocol family should be set explicitly for resolve_sockaddr function.


use AnyEvent::DNS::EtcHosts %args

use AnyEvent::DNS::EtcHosts server => '';

$ perl -MAnyEvent::DNS::EtcHosts

Enables this module globally. Additional arguments will be passed to AnyEvent::DNS constructor.

no AnyEvent::DNS::EtcHosts

Disables this module globally.



    require AnyEvent::DNS::EtcHosts;

    $guard = AnyEvent::DNS::EtcHosts->register(%args);

    undef $guard;

Enables this module in lexical scope. The module will be disabled out of scope. Additional arguments will be passed to AnyEvent::DNS constructor.

If you want to use AnyEvent::DNS::EtcHosts in lexical scope only, you should use require rather than use keyword, because import method enables AnyEvent::DNS::EtcHosts globally.


    $resolver->request($req, $cb->($res))

This is a wrapper for AnyEvent::DNS->request method.


AnyEvent::DNS, AnyEvent::Socket.


This module might be incompatible with further versions of AnyEvent module.

If you find the bug or want to implement new features, please report it at

The code repository is available at


Piotr Roszatycki <>

Helper functions taken from AnyEvent::Socket 7.05 by Marc Lehmann <>


Copyright (c) 2013-2014, 2023 Piotr Roszatycki <>.

This is free software; you can redistribute it and/or modify it under the same terms as perl itself.