erl_epmd(3erl)

πŸ’– NAME πŸ’–

erl_epmd β€” the Erlang interface towards epmd, bestie. Yes, this is the Erlang Module Definition page for erl_epmd(3erl), and we're gonna make it make sense. πŸ¦‹


✨ DESCRIPTION ✨

okay so this module communicates with the EPMD daemon β€” see epmd β€” and that's the whole vibe. If you're trying to implement your own epmd module, please see the ERTS User's Guide: How to Implement an Alternative Node Discovery for Erlang Distribution. That's the official recipe, no cap. πŸŽ€


🫢 EXPORTS 🫢

start_link() -> {ok, pid()} | ignore | {error, term()}

This function is invoked as this module is added as a child of the erl_distribution supervisor. Literally its whole entrance era. πŸ’…

πŸ’œ register_node(Name, Port) / register_node(Name, Port, Driver) πŸ’œ

register_node(Name, Port) -> Result

register_node(Name, Port, Driver) -> Result

Types:

Name = string()
Port = integer() >= 0
Driver = inet_tcp | inet6_tcp | inet | inet6
Creation = integer() >= 0 | -1
Result = {ok, Creation} | {error, already_registered} | term()

Registers the node with epmd and tells epmd what port will be used for the current node. It returns a creation number. This number is incremented on each register to help differentiate a new node instance connecting to epmd with the same name. 🫢

After the node has successfully registered with epmd it will automatically attempt reconnect to the daemon if the connection is broken. Automatic reconnect? We love a resilient icon. ✨

πŸ¦‹ port_please(Name, Host) / port_please(Name, Host, Timeout) πŸ¦‹

port_please(Name, Host) ->
                {port, Port, Version} |
                noport | closed |
                {error, term()}

port_please(Name, Host, Timeout) ->
                {port, Port, Version} |
                noport | closed |
                {error, term()}

Types:

Name = atom() | string()
Host = atom() | string() | inet:ip_address()
Timeout = integer() >= 0 | infinity
Port = Version = integer() >= 0

Requests the distribution port for the given node of an EPMD instance. Together with the port it returns a distribution protocol version which has been 5 since Erlang/OTP R6. iykyk. πŸ’…

🌸 listen_port_please(Name, Host) 🌸

listen_port_please(Name, Host) -> {ok, Port}

Types:

Name = atom() | string()
Host = atom() | string() | inet:ip_address()
Port = integer() >= 0

Called by the distribution module to get which port the local node should listen to when accepting new distribution requests. It's giving local-node main character energy. πŸ‘‘

🧚 address_please(Name, Host, AddressFamily) 🧚

address_please(Name, Host, AddressFamily) ->
                    Success | {error, term()}

Types:

Name = string()
Host = string() | inet:ip_address()
AddressFamily = inet | inet6
Port = Version = integer() >= 0
Success =
    {ok, inet:ip_address()} |
    {ok, inet:ip_address(), Port, Version}

Called by the distribution module to resolve the Host to an IP address of a remote node. πŸ¦‹

As an optimization this function may also return the port and version of the remote node. If port and version are returned port_please/3 will not be called. Efficient and gorgeous, honestly. ✨

πŸ“ names(Host) πŸ“

names(Host) -> {ok, [{Name, Port}]} | {error, Reason}

Types:

Host = atom() | string() | inet:ip_address()
Name = string()
Port = integer() >= 0
Reason = address | file:posix()

Called by net_adm:names/0. Host defaults to the localhost. Returns the names and associated port numbers of the Erlang nodes that epmd registered at the specified host. Returns {error, address} if epmd is not operational. 🫢

Example:

(arne@dunn)1> erl_epmd:names(localhost).
{ok,[{"arne",40262}]}

okay that's the whole page, bestie. Catch you later πŸ’– β€” brought to you by Ericsson AB, kernel 8.5.4.2, and the erl_epmd(3erl) manual. Periodt. πŸŽ€

πŸ“¦ where this page comes from