net_adm:names() failing

Vance Shipley vances@REDACTED
Mon Oct 4 00:56:13 CEST 1999


Magnus,

Unfortunately this patch didn't seem to have any effect. :(

	-Vance

}  -----Original Message-----
}  From: owner-erlang-questions@REDACTED
}  [mailto:owner-erlang-questions@REDACTED]On Behalf Of Magnus Fr berg
}  Sent: Friday, October 01, 1999 2:55 AM
}  To: Vance Shipley
}  Cc: erlang-questions@REDACTED
}  Subject: Re: net_adm:names() failing
}  
}  
}  Hi !
}  
}  Vance Shipley wrote:
}  > 
}  > I seem to be having some problems with tcp on my Unixware
}  > port.  I believe that I'm loosing messages when the socket
}  > gets closed.  Anybody have any ideas?
}  
}  I noticed the same some time ago (I think it was on SUSE linux) and made
}  some changes to erl_epmd.erl. Seems like it was after the latest open
}  source release though.
}  
}  > 
}  > On my Unixware port I have a problem with net_adm:names()
}  > returning {ok, []} at all times (not just using short host
}  > names as I reported before).
}  > 
}  > Some debugging shows that in the module erl_epmd, in the
}  > function do_get_names, the socket seems to be getting closed
}  > before the return message is received.  In the receive loop
}  > the {tcp, Socket, [P0,P1,P2,P3|T]} never gets called, just
}  > the {tcp_closed, Socket}.
}  > 
}  
}  The problem is that we cant be sure about that the 4 bytes port header
}  arrives in the same tcp package. I send a fix I made right now (I
}  compiled it and it seems to work ok for me;-).
}  
}  erl_epmd.erl:
}  
}  do_get_names(Socket) ->
}      inet_tcp:send(Socket, [?int16(1),?EPMD_NAMES]),
}      do_get_names(Socket, []).
}  
}  do_get_names(Socket, PList) ->
}      receive
}  	{tcp, Socket, Bytes} ->
}  	    case get_port(Bytes, PList) of
}  		{ok, ?erlang_daemon_port, T} ->
}  		    names_loop(Socket, T, []);
}  		{more, PList1} ->
}  		    do_get_names(Socket, PList1);
}  		_ ->
}  		    close(Socket),
}  		    {error, address}
}  	    end;
}  	{tcp_closed, Socket} ->
}  	    {ok, []}
}      end.
}  
}  get_port(Bytes, [P0,P1,P2,P3]) ->
}      {ok, ?u32(P0,P1,P2,P3), Bytes};
}  get_port([H|Bytes], PList) ->
}      get_port(Bytes, PList ++ [H]);
}  get_port([], PList) ->
}      {more, PList}.
}  
}  Hope this was your case as well.
}  
}  /Magnus
}  



More information about the erlang-questions mailing list