有没有一种简单的方法来获取连接的 erlang 节点的 IP 地址?我想启动与几个节点的 SCTP 连接,由于系统的设计方式,我对它们的了解只是它们的 node() 原子。
更准确地说,我想知道是否有一些由 Erlang 提供的 API(或一些派生技术)允许在给定标识符 atom() 的情况下获取节点的 IP 地址。
有没有一种简单的方法来获取连接的 erlang 节点的 IP 地址?我想启动与几个节点的 SCTP 连接,由于系统的设计方式,我对它们的了解只是它们的 node() 原子。
更准确地说,我想知道是否有一些由 Erlang 提供的 API(或一些派生技术)允许在给定标识符 atom() 的情况下获取节点的 IP 地址。
您可以使用 rpc 模块在外部节点上调用该函数
例子:
rpc:call(Node,inet,getif,[])
注意:这仅适用于已经通过 erlang 分发连接的节点
我通过在节点上启动一个进程并让该进程发送一条包含其 IP 地址的消息来解决了这个问题。如果有人知道更优雅的解决方案,我想听听。
在节点上的进程启动后,我用来获取地址的命令是:inet:getif()
. 请记住,该命令的结果包括环回地址。
需要考虑的是每个节点可能有多个 IP 地址,并且 SCTP 服务器可能不会监听所有这些地址。
我想尝试的另一个想法是将 node() 返回的原子转换为字符串,解析字符串以获取主机名,然后执行 DNS 查找。它可能有效,但我从未尝试过。DNS 查找的结果应该被缓存,因此可能没有网络往返。另外,我真的很讨厌假设任何关于从 node() 返回的原子。
看起来net_kernel:nodes_info()
- 对于所有节点 - 和net_kernel:node_info(Node)
单个节点 - 都有这些信息,还有更多,尽管它看起来不像在手册页中发布。在某些方面,这似乎是一个更好的解决方案,因为它也适用于您无法向其发送函数的 Java 和 C 节点之类的东西。