Hi!
I’ve been able to setup child nodes, but I’m trying to get them online. The intention is to make the nodes act as separate computers, such that I can broadcast messages to them via udp.
Code I’ve been using for parent node:
Node.start(:master@localhost, :shortnames)
(When running :longnames, I get a name error when initializing child nodes)
Code for initializing child nodes:
defmodule Child_Nodes do
def init child_names do
:os.cmd('epmd -daemon')
for child_name <- child_names do
{:ok, node} = start_child child_name
load_code node
end
end
def project_module_path do
Path.absname('_build/dev/ebin') |>
to_charlist()
end
def start_child name do
:slave.start(:localhost, name)
end
def load_code node do
:rpc.block_call(node, :code, :add_paths, [:code.get_path()])
:rpc.block_call(node, :code, :add_paths, [project_module_path()])
end
end
This allows me to run my projects code on the child_nodes and access them using Node.ping(). However, each node are going to find eachother over udp using this module, with different ports:
defmodule Broadcasting do
@broadcast_timeout 1000
@localhost {10, 0, 0, 68}
#Node-name format: OrderHandler_<port>@<address>
def init port do
{:ok, socket} = :gen_udp.open(port, [active: true, broadcast: true])
Task.async fn -> broadcast socket, port end
IO.puts "Node at port #{port} initialized"
listen socket, port
end
def broadcast socket, port do
:gen_udp.send(socket, {255,255,255,255}, port, to_string(port))
:timer.sleep(@broadcast_timeout)
broadcast socket, port
end
def listen socket, port do
local_msg = to_string(port)
receive do
{:udp, _socket, _address, port, ^local_msg} ->
IO.inspect port
IO.puts "localmsg"
listen socket, port
{:udp, _socket, address, remote_port, _msg} ->
string_address = ip_to_string(address)
IO.puts "new node added at port: #{port}"
#"OrderHandler_" <> to_string(remote_port) <> "@" <> string_address |> String.to_atom |> Node.ping
#localhost-version
"OrderHandler_" <> to_string(remote_port) <> "@localhost" |> String.to_atom |> Node.ping
end
end
def ip_to_string ip do
:inet.ntoa(ip) |> to_string()
end
end
Is it possible to bring all child nodes online?