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);
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);
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)
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