[erlang-questions] inet_res:getbyname/2 and udp:connect/3
Tony Rogvall
tony@REDACTED
Wed Jun 16 14:35:24 CEST 2010
On 16 jun 2010, at 08.07, Per Hedeland wrote:
>
>> Try an other interface where there is a host ...
>
> Haven't done that, maybe I will (right now I happen to be on a network
> where other hosts don't have the courtesy to send ICMP unreachables:-).
> I noticed something else interesting though - in passive mode:
>
> 9> gen_udp:send(U, <<1,2,3>>).
> ok
> 10> gen_udp:send(U, <<1,2,3>>).
> {error,econnrefused}
> 11> gen_udp:send(U, <<1,2,3>>).
> ok
> 12> gen_udp:send(U, <<1,2,3>>).
> {error,econnrefused}
> 13> gen_udp:send(U, <<1,2,3>>).
> ok
> 14> gen_udp:send(U, <<1,2,3>>).
> {error,econnrefused}
>
> I.e. the error is detected, but only on a subsequent send() (which
> doesn't actually send anything).
>
Cool!
send is failing on subsequent send, but recv is not ???? This is strange times.
Do you think this behavior is documented anywhere?
A small C program may clear this issue for us ?
/Tony
A small comment intended for the list readers that do understand what we are talking about.
When running the inet_res:resolve function (and friends) it will never return {error,econnrefused}
But the result {error,timeout} even before the timeout value. This may be a bug or not, for now it is "historical reasons" and
"convenient". The reasons is that one or several name severs may get econnrefused while others may timeout.
To get the {error, econnrefused} speed things up when trying servers where DNS servers may have crashed.
But in the general case, server may be down/burned, routers is down/corrupt, this will not help since no one will send
the ICMP reply message on the network.
Example:
inet_res:resolve("www.rogvall.se", in, a, [{nameservers,[{{127,0,0,1},53}]},verbose], 5000).
Query: {msg,[{header,{header,[{id,7},
{qr,0},
{opcode,'query'},
{aa,0},
{tc,0},
{rd,true},
{ra,0},
{pr,0},
{rcode,0}]}},
{qdlist,[{dns_query,[{domain,"www.rogvall.se"},
{type,a},
{class,in}]}]},
{anlist,[]},
{nslist,[]},
{arlist,[]}]}
Try UDP server : {127,0,0,1}:53 (timeout=666)
UDP server error: {error,econnrefused}
{error,timeout}
Trying a host that do not exist:
inet_res:resolve("www.rogvall.se", in, a, [{nameservers,[{{127,0,0,2},53}]},verbose], 5000).
Query: {msg,[{header,{header,[{id,8},
{qr,0},
{opcode,'query'},
{aa,0},
{tc,0},
{rd,true},
{ra,0},
{pr,0},
{rcode,0}]}},
{qdlist,[{dns_query,[{domain,"www.rogvall.se"},
{type,a},
{class,in}]}]},
{anlist,[]},
{nslist,[]},
{arlist,[]}]}
Try UDP server : {127,0,0,2}:53 (timeout=666)
UDP server error: {error,timeout}
Try UDP server : {127,0,0,2}:53 (timeout=1333)
UDP server error: {error,timeout}
Try UDP server : {127,0,0,2}:53 (timeout=2666)
UDP server error: {error,timeout}
{error,timeout}
/Tony
More information about the erlang-questions
mailing list