Menu

API Comunicaciones

Hector Juan Nahuel

El objetivo de este modulo, es abstraer las comunicaciones al usuario de la bolsa.

¡¡¡¡IMPORTANTE!!!!

La Interfaz MPI no soporta threads, si se quiere utilizar de forma concurrente es necesario que se utilice en procesos separados de lo contrario el correcto funcionamiento no esta garantizado, en un mismo proceso pueden haber mas de dos instancias de MPI ENDPOINTS pero se tienen que utilizar de forma secuencial. Comuniquese con su proveedor de APIs para mas detalles al respecto :P

El API tiene en su interior un archivo que contiene pares del estilo:

Identificardor Direccion Fisica
bolsa_agente1 192.168.0.1:45663
bolsa_agente2 192.168.0.2:47501

Luego habra otro archivo con la configuracion del la api para un proceso en particular, tendra el siguiente formato:

# API configuration file
# Definicion de variables para configurar
# 
# PATH = Archivo utilizado para distinguir la conexion (Cadena de caracteres) 
#
# HANDS = Devuelve el nombre apropiado para distinguir univocamente a un host (Y/N)
# RESOLVES = Determina si resuleve pedido de hosts desconocidos (Y/N)
#
# HANDER_ADDR = Direccion a la cual solicitar el nombre para este host (Hostname o IP)
# RESOLVER_ADDR = Direccion a la cual solicitar resolver nombres
#
#
# Configuracion de ejemplo
PATH=/root/testdir

HAND=Y
RESOLVES=N

HANDER_ADDR=gandalf
RESOLVER_ADD=192.168.1.1

La interfaz que utilizara el usuario es la siguiente:

Inicializacion

Para poder inicializar la interfaz el usuario debera instanciar un elemento de la clase MPI para lo cual deberá llamar a la siguiente funcion:

MPI_ENDPOINT inicializar(const std::string& ruta,std::string& hostName,MPI_ENDPOINT& endPointGenerico);

  • ruta: Ruta al archivo de configuracion
  • hostName: Devuelve el nombre de host que se le asigno al proceso
  • endPointGenerico: Un elemento de la clase MPI_ENDPOINT, este elemento permite recibir cualquier tipo de mensajes sin discriminar en tipo u origen, siempre y cuando sea la primera vez que se instancia el MPI, de lo contrario es un MPI comun sin registrar.
  • retorno: Retorna un codigo de error

Utilizacion

Para poder enviar y recibir mensajes es necesario crear un MPI_ENDPOINT.
Un EndPoint podra enviar mensajes sin estar registrado pero solo podra recibir debera registrarse, para crear hay que llamar a la función siguiente:

MPI_ENDPOINT generarEndPoint();

Esta funcion regresa un elemento de la clase MPI_ENDPOINT que no estara registrado, para ello hay que llamar a la siguiente funcion de la clase MPI_ENDPOINT:

int registrar(const std::string& origen,int tipo);

  • origen: Espesifica si se desea recibir un mensaje espesifico de algun emisor.
  • tipo: Indica si desea recibir un tipo espesifico de mensaje.
  • retorno: Si no habia otro ENDPOINT registrado con esos valores regresa REGISTRATION_OK, de lo contrario regresa REGISTRATION_FAIL

Para utilizar el ENDPOINT registrado se tienen las siguientes funciones:

int enviar(const MPIPacket& mensaje,const std::string& destino,int tipo)

int recibir(MPIPacket& mensaje,std::string& origen,int& tipo)

  • mensaje: Es el mensaje a enviar o recibir segun corresponda.
  • destino: Indica para quien esta dirigido el mensaje.
  • origen: Indica de quien era el mensaje leído.
  • tipo: Indica el tipo de mensaje a enviar o el recibido
  • retorno: Devuelve un codigo de error.

Una vez finalizado el uso del ENDPOINT hay que llamar a la funcion:

void desregistrar();

Luego de desregistrar se puede destruir el ENDPOINT o reutilizarlo

Por ultimo para destruir el MPI hay que llamar a la funcion:

void destruir();

El formato MPIPacket es una clase abstracta que el usuario de la API deberá utilizar para enviar y recibir mensajes. Su prototipo es el siguiente:

#define MPIPACKET_SIZE 512

class MPIPacket {
public:
    MPIPacket(){};
    MPIPacket(const MPIPacket& p);
    MPIPacket& operator=(const MPIPacket& p);
    virtual ~MPIPacket(){};

    virtual void toBuffer(unsigned char* buffer) const = 0;
    virtual void fromBuffer( unsigned char* buffer) = 0;

    virtual int getSize() const { return MPIPACKET_SIZE; }
};

El tamaño del mensaje no podrá superar los 512 bytes


Related

Wiki: Home

Discussion


Log in to post a comment.