2012-08-31 14 views
7

¿Hay una manera simple de obtener la dirección IP de un nodo erlang conectado? Me gustaría iniciar una conexión SCTP con unos pocos nodos y, debido a la forma en que se diseña el sistema, el conocimiento que tengo sobre ellos es solo su átomo nodo().¿Cómo obtengo la dirección IP de un nodo Erlang?

Más precisamente, me pregunto si hay alguna API provista por Erlang (o alguna técnica derivada) que permita obtener la dirección IP de un nodo dado su identificador atom().

Respuesta

4

Se puede utilizar el módulo de RPC para llamar a la función en un nodo extranjera

ejemplo:

rpc:call(Node,inet,getif,[]) 

nota: esto sólo funciona en los nodos que ya están conectados a través de la distribución Erlang

2

He resuelto este problema iniciando un proceso en el nodo y haciendo que el proceso envíe un mensaje que contenga sus direcciones IP. Si alguien sabe de una solución más elegante, me gustaría escucharla.

El comando que utilicé para obtener la dirección una vez que se inició el proceso en el nodo fue: inet:getif(). Tenga en cuenta que el resultado de ese comando incluye la dirección de bucle invertido.

Algo a considerar es que cada nodo puede tener múltiples direcciones IP y el servidor SCTP puede no estar escuchando en todos ellos.

La otra idea que pensé sobre intentar fue convertir el átomo devuelto de node() en una cadena, analizar la cadena para obtener el nombre de host y realizar una búsqueda de DNS. Podría funcionar, pero nunca lo intenté. El resultado de la búsqueda de DNS debe almacenarse en caché, por lo que es posible que no haya una redirección de ida y vuelta. Además, realmente odio asumir cualquier cosa sobre el retorno del átomo desde el nodo().

+0

Sí, pensé en hacer eso, pero quería minimizar el tiempo entre saber que necesito enviar datos, y el envío real de datos, por lo que un ciclo adicional de ida y vuelta sería el último recurso. – matehat

2

Se parece net_kernel:nodes_info() - para todos los nodos - y net_kernel:node_info(Node) para un solo nodo - tiene esta información, y más, aunque no parece que se haya publicado en la página de manual. Esto parece ser una solución mejor en algunos aspectos, ya que también funcionará con elementos como nodos Java y C a los que no se pueden enviar funciones.

Cuestiones relacionadas