[erlang-questions] {error,timeout} with gethostbyname

Raimo Niskanen raimo+erlang-questions@REDACTED
Fri Sep 25 15:33:35 CEST 2009


On Fri, Sep 25, 2009 at 03:16:41PM +0200, info wrote:
> On Fri, Sep 25, 2009 at 12:03:38PM +0200, info wrote:
> > Hi Raimo,
> > Note that I appreciate your help because it seems that the problem is not in erlang.
> > 
> > On Thu, Sep 24, 2009 at 04:55:57PM +0200, info wrote:
> >  > I also tried to add the address of my dns server.
> >  > inet_db:add_ns({ip}).
> >  > But no effect.
> >  > 
> >  > inet_getrc(). gives now:
> >  > 
> >  > [{host,{127,0,0,1},["my_host"]},
> >  >  {nameserver,{192,168,1,33}}]
> >  > 
> > You have {res_lookup,[native,file]} meaning first is the OS
> > gethostbyname equivalent function used. During the startup
> > of Erlang it discovered that "my_host" could not be
> > resolved so it entered "my_host" as {127,0,0,1} into the
> > internal hosts table to ensure that inet:gethostbyname("my_host")
> > would succeed.
> > 
> > But the native lookup method times out, probably due
> > to misconfigured name resolving in the OS, so the
> > internal hosts table is never used.
> > 
> > How long does the call inet:gethostbyname("my_host")
> > take to return {error,timeout}?
> >  > > > > > > > > > > > > 6-7 seconds
> 
> Ok...
> 
> > 
> > Can the native lookup method look up any name at all?
> > Try: inet_gethost_native:gethostbyname("localhost").
> >  > > > > > > > > > > > > {error,timeout}
> > inet_gethost_native:gethostbyname("my_host").
> >  > > > > > > > > > > > > {error,timeout}
> > inet_gethost_native:gethostbyname("www.google.com").
> >  > > > > > > > > > > > > {error,timeout}
> 
> Nothing worked.
> 
> >  >From a Windows command shell, try:
> > nslookup my_host
> >  > > > > > > > > > > > >server: my_host.my_domain.local
> >  > > > > > > > > > > > >address: 192.168.1.33
> >  > > > > > > > > > > > >name: my_host.my_domain.local
> >  > > > > > > > > > > > >address: 192.168.1.33
> > nslookup localhost
> >  > > > > > > > > > > > >server: my_host.my_domain.local
> >  > > > > > > > > > > > >address: 192.168.1.33
> >  > > > > > > > > > > > >my_host.my_domain.local doesn't find localhost: no existing domain (*** I translated from french ! )
> 
> Well well, of course that worked...
> This means your host is its own DNS server (?).
> 
> > 
> > Pay special attention to which nameserver that answers.
> > 
> > If you can not fix the network configuration, which will
> > solve your problem, you can configure erlang to not
> > use the native lookup method. The erlang DNS resolver
> > client was much improved to R13B02, but it worked
> > well in R13B01 too.
> >  > > > > > > > > > > > >My problem is I don't see what is wrong in my network configuration or in my dns server configuration !
> > Set the lookup method to [file,dns] and add your
> > nameserver as you tried:
> > inet_db:add_ns({192,168,1,33}).
> >  > > > > > > > > > > > >ok
> > inet_db:set_lookup([file,dns]).
> >  > > > > > > > > > > > >ok
> > Then try inet:gethostbyname("my_host"),
> >  > > > > > > > > > > > >{ok,{hostent,"my-host",[],inet,4,[{127,0,0,1}]}}             BETTER !!
> 
> That is the patched 'file' lookup method that found the name.
> This is often enough to run a local non-distributed node.
> 
> > or even inet_res:gethostbyname("my_host).
> >  > > > > > > > > > > > >{error,timeout}                         WHY ?
> 
> Maybe your firewall does not allow DNS requests from erlang.
> Try:
> rr(inet_res).
> +++++++
> [connect_opts,dns_header,dns_query,dns_rec,dns_rr,hostent,
>  listen_opts,sctp_opts,udp_opts]
> 
> inet_res:nslookup("my_host.my_domain.local", in, a, [{{192,168,1,33},53}]).
> +++++++
> {ok,#dns_rec{header = #dns_header{id = 2,qr = 1,opcode = 0,
>                                   aa = 1,tc = 0,rd = 1,ra = 1,pr = 0,
>                                   rcode = 0},
>              qdlist = [#dns_query{domain = "my_host.my_domain.local",
>                                   type = a,class = in}],
>              anlist = [#dns_rr{domain = "my_host.my_domain.local",class = in,
>                                type = a,cnt = 0,tm = undefined,ttl = 3600,
>                                bm = [],
>                                data = {192,168,1,33},
>                                func = false}],
>              nslist = [],arlist = []}}
> 
> 
> And, maybe using the external IP address is what is not allowed.
> inet_res:nslookup("my_host.my_domain.local", in, a, [{{127,0,0,1},53}]).
> +++++++++
> {ok,#dns_rec{header = #dns_header{id = 3,qr = 1,opcode = 0,
>                                   aa = 1,tc = 0,rd = 1,ra = 1,pr = 0,
>                                   rcode = 0},
>              qdlist = [#dns_query{domain = "my_host.my_domain.local",
>                                   type = a,class = in}],
>              anlist = [#dns_rr{domain = "my_host.my_domain.local",class = in,
>                                type = a,cnt = 0,tm = undefined,ttl = 3600,
>                                bm = [],
>                                data = {192,168,1,33},
>                                func = false}],
>              nslist = [],arlist = []}}
> +++++++++++++
>  inet_gethost_native:gethostbyname("www.google.com").                
> {error,timeout}
> inet_gethost_native:gethostbyname("localhost").                     
> {error,timeout}
> inet_gethost_native:gethostbyname("my_host").                      
> {error,timeout}
> 
> DO YOU SEE A DIFFERENCE ?

Nope.

This means that:
	inet_db:add_ns({127,0,0,1}).
	inet_db:set_domain("my_domain.local").
	inet_db:add_search("my_domain.local").
	inet_db:set_lookup([file,dns]).
should make inet:gethostbyname("my_host") work.

But that is a workaround. The native lookup should work.
Windows nslookup also probably bypasses the normal
name resolving functions and does direct DNS queries.

Is it maybe an issue with your DHCP server that i does
not state a DNS server, since you use your local
machine as DNS server. Google for name resolving for
Windows 2003...


> 
> > But I hope you can fix your network configuration instead...
> > 
> >  > 
> >  > 
> >  > n Wed, Sep 23, 2009 at 04:31:35PM +0200, info wrote:
> >  >   > Hi all,
> >  >   > On a windows 2003 server sbs this command returns {ok,"my_host"} :
> >  >   > 
> >  >   > {ok,N}=inet:gethostname().
> >  >   > 
> >  >   > But the following command returns {error,timeout} :
> >  >   > 
> >  >   > inet:gethostbyname(N).
> >  >   > 
> >  >   > On a Vista machine, the previous command returns a correct answer.
> >  >   > 
> >  >   > I know that it is not an erlang problem but if you could give me support, I will appreciate ;-)
> >  > 
> >  > Erlang may have problems configuring name lookups.
> >  > Give me the output from ets:tab2list(inet_db).
> >  > 
> >  > Which erlang release are you running, it sounds like pre-R13B02?
> >  > 
> >  > Try starting with erl -name foo
> >  > and do the same, ets:tab2list/1 too.
> >  > 
> >  > -- 
> >  > 
> >  > / Raimo Niskanen, Erlang/OTP, Ericsson AB
> > 
> > -- 
> > 
> > / Raimo Niskanen, Erlang/OTP, Ericsson AB
> 
> -- 
> 
> / Raimo Niskanen, Erlang/OTP, Ericsson AB

-- 

/ Raimo Niskanen, Erlang/OTP, Ericsson AB


More information about the erlang-questions mailing list