From 4acde449bc9dd44a5d6b70259a8e0414bc5461a2 Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Sat, 2 Apr 2022 18:54:39 +0900 Subject: [PATCH] Update README.md --- README.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index de0084a..7ee257b 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,60 @@ Rust Implementation of [Erlang Distribution Protocol](http://erlang.org/doc/apps The distribution protocol is used to communicate with distributed erlang nodes. -[Documentation](https://docs.rs/erl_dist) - Examples --------- +--------- + +Gets a node entry from EPMD: +```rust +use erl_dist::epmd::{DEFAULT_EPMD_PORT, EpmdClient}; + +// Connect to the local EPMD. +let connection = TcpStream::connect(("localhost", DEFAULT_EPMD_PORT)).await?; +let client = EpmdClient::new(connection); + +// Get the information of a node. +let node_name = "foo"; +if let Some(node) = client.get_node(node_name).await? { + println!("Found: {:?}", node); +} else { + println!("Not found"); +} +``` + +Sends a message to an Erlang node: +```rust +use erl_dist::LOWEST_DISTRIBUTION_PROTOCOL_VERSION; +use erl_dist::node::{Creation, LocalNode}; +use erl_dist::handshake::ClientSideHandshake; +use erl_dist::term::{Atom, Pid}; +use erl_dist::message::{channel, Message}; + +// Connect to a peer node. +let peer_host = "localhost"; +let peer_port = 7483; // NOTE: Usually, port number is retrieved from EPMD. +let connection = TcpStream::connect((peer_host, peer_port)).await?; + +// Local node information. +let creation = Creation::random(); +let local_node = LocalNode::new("foo@localhost".parse()?, creation); + +// Do handshake. +let mut handshake = ClientSideHandshake::new(connection, local_node.clone(), "cookie"); +let _status = handshake.execute_send_name(LOWEST_DISTRIBUTION_PROTOCOL_VERSION).await?; +let (connection, peer_node) = handshake.execute_rest(true).await?; + +// Create a channel. +let capability_flags = local_node.flags & peer_node.flags; +let (mut tx, _) = channel(connection, capability_flags); + +// Send a message. +let from_pid = Pid::new(local_node.name.to_string(), 0, 0, local_node.creation.get()); +let to_name = Atom::from("bar"); +let msg = Message::reg_send(from_pid, to_name, Atom::from("hello").into()); +tx.send(msg).await?; +``` +Example commands: - EPMD Client Example: [epmd_cli.rs](examples/epmd_cli.rs) - Client Node Example: [send_msg.rs](examples/send_msg.rs) - Server Node Example: [recv_msg.rs](examples/recv_msg.rs)