////////////////////////////////////////////////////PROGRAMA PRINCIPAL////////////////////////////////////////////////////
int main (){
	nivelTerminado=false;
	huboCambios=false;

	listaDeEnemigos = list_create();
	items = list_create(); // CREO LA LISTA DE ITEMS
	listaPersonajesRecursos = list_create(); //CREO LA LISTA DE PERSONAJES CON SUS RECURSOS
	config = config_create(RUTA); //CREO LA RUTA PARA EL ARCHIVO DE CONFIGURACION

	pthread_mutex_init(&mutex_mensajes, NULL );
	pthread_mutex_init(&mutex_listas, NULL );
	pthread_mutex_init(&mutex_log, NULL );
	pthread_mutex_init(&mx_lista_items,NULL);

	leerArchivoConfiguracion(); //TAMBIEN CONFIGURA LA LISTA DE RECURSOS POR NIVEL
	dibujar();

	crearHiloInotify(hiloInotify);


	socketDeEscucha=handshakeConPlataforma();


	 //SE CREA UN SOCKET NIVEL-PLATAFORMA DONDE RECIBE LOS MENSAJES POSTERIORMENTE


	if (crearLosEnemigos){

		pthread_mutex_lock(&mutex_log);
		log_info(logger,"Se levantaron los enemigos");
		pthread_mutex_unlock(&mutex_log);

		crearHilosEnemigos();
	}
	if(activarInterbloqueo){
		crearHiloInterbloqueo();
	}

	while(1){
		if(socketDeEscucha!=-1){
			mensajesConPlataforma(socketDeEscucha); //ACA ESCUCHO TODOS LOS MENSAJES EXCEPTO HANDSHAKE

		}else{
			pthread_mutex_lock(&mutex_log);
			log_info(logger, "Hubo un error al leer el socket y el programa finalizara su ejecucion");
			pthread_mutex_unlock(&mutex_log);

			eliminarEstructuras();
			break;
		}

	}


	return true;
}
Beispiel #2
0
int main(void) {

	leerArchivoConfiguracion("configPlanificador");
	crearArchivoLog();

	listenningSocket = Escuchar(PUERTO_ESCUCHA);
	socketCPU = Aceptar(listenningSocket);
	Enviar(socketCPU, "BIENVENIDO A PLANIFICADOR");

	consola();

	Desconectar(listenningSocket);
	Desconectar(socketCPU);

	return EXIT_SUCCESS;
}
int main(void) {

	leerArchivoConfiguracion("configSwap");
	crearArchivoLog();

	int listenningSocket = Escuchar(PUERTO_ESCUCHA);
	int socketMemoria = Aceptar(listenningSocket);
	Enviar(socketMemoria, "BIENVENIDO A SWAPILANDIA");

	char* comando;
	char* parametro;
	comando = Recibir(socketMemoria);
	parametro = Recibir(socketMemoria);
	printf("Recibi el siguiente comando %s %s\n", comando, parametro);

	Desconectar(listenningSocket);
	Desconectar(socketMemoria);

	return EXIT_SUCCESS;
}
Beispiel #4
0
int main(int argc, char** argv)
{
    SOCKET sockQM;
    int mensajeEsperando = 0;

    SOCKET sockPrimerQP;
    SOCKADDR_IN dirPrimerQP;
    int nAddrSize = sizeof(dirPrimerQP);
    
    ptrListaQuery listaHtml = NULL;
    ptrListaQuery listaArchivos = NULL;
    ptrListaRanking listaPalabras = NULL;
    ptrListaRanking listaRecursos = NULL;

    fd_set fdMaestro;
    fd_set fdLectura;
    struct timeval timeout;
    int fdMax, cli;
    mode_t modeOpen = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
    fdMax = cli = 0;
    char text[60];

    /*Se inicializa el mutex*/
    mutex_init(&logMutex, USYNC_THREAD, NULL);

    /*Se crea el archivo log*/
    if ((log = open("log.txt", O_CREAT | O_TRUNC | O_WRONLY, modeOpen)) < 0)
        rutinaDeError("Crear archivo Log", log);

    WriteLog(log, "Query Manager", getpid(), thr_self(), "Inicio de ejecucion", "INFO");  

    /*Lectura de Archivo de Configuracion*/
    WriteLog(log, "Query Manager", getpid(), thr_self(), "Se leera archivo de configuracion", "INFO");
    if (leerArchivoConfiguracion(&config) != 0)
       rutinaDeError("Lectura Archivo de configuracion", log);
    WriteLog(log, "Query Manager", getpid(), thr_self(), "Leido OK", "INFOFIN");

    /*Se establece conexion a puerto de escucha*/
    WriteLog(log, "Query Manager", getpid(), thr_self(), "Se establecera conexion de escucha", "INFO");
    if ((sockQM = establecerConexionEscucha(INADDR_ANY, config.puertoL)) == INVALID_SOCKET)
       rutinaDeError("Socket invalido", log);
    WriteLog(log, "Query Manager", getpid(), thr_self(), "Establecido OK", "INFOFIN");

    do
    {
        WriteLog(log, "Query Manager", getpid(), thr_self(), "Esperando primer Query Processor para estar operativo...", "INFOFIN");
        putchar('\n');

        /*Acepta la conexion entrante del primer QP, condicionante para estar operativo*/
        sockPrimerQP = accept(sockQM, (SOCKADDR *) &dirPrimerQP, &nAddrSize);
        if (sockPrimerQP == INVALID_SOCKET)
            WriteLog(log, "Query Manager", getpid(), thr_self(), "No se pudo conectar al Query Processor", "ERROR");
    } while (sockPrimerQP == INVALID_SOCKET);

    sprintf(text, "Query Processor en %s conectado.\n", inet_ntoa(dirPrimerQP.sin_addr));
    WriteLog(log, "Query Manager", getpid(), thr_self(), text, "INFOFIN");

    /*Se agregan los sockets abiertos y se asigna el maximo actual*/
    FD_ZERO (&fdMaestro);
    FD_SET(0, &fdMaestro); /*Añado stdin*/
    FD_SET(sockQM, &fdMaestro);
    FD_SET(sockPrimerQP, &fdMaestro);
    fdMax = sockQM > sockPrimerQP? sockQM: sockPrimerQP;

   /*
    * Ya se recibio la conexion del primer QP, ya se puede establecer la conexion con el Front-End.
    * Se conecta al Front-End, se le envia la IP y Puerto local, y se cierra conexion.
    */
    WriteLog(log, "Query Manager", getpid(), thr_self(), "Se establecera conexion con Front-end", "INFO");
    if (conectarFrontEnd(config.ipFrontEnd, config.puertoFrontEnd) < 0)
       rutinaDeError("Conexion a Front-End", log);
    WriteLog(log, "Query Manager", getpid(), thr_self(), "Conexion establecida OK", "INFOFIN");

    while (1)
    {
        int rc, desc_ready;

        timeout.tv_sec = 20;
        timeout.tv_usec = 0;

        FD_ZERO(&fdLectura);
        memcpy(&fdLectura, &fdMaestro, sizeof(fdMaestro));

        if (!mensajeEsperando)
        {
            mensajeEsperando = 1;
            WriteLog(log, "Query Manager", getpid(), thr_self(), "Esperando nuevas peticiones", "INFOFIN");
        }

        rc = select(fdMax+1, &fdLectura, NULL, NULL, &timeout);

        if (rc < 0)
            rutinaDeError("select", log);
        else if (rc == 0)
        {
            /*SELECT TIMEOUT*/
            ptrListaQuery ptrAux = listaHtml;

            /*printf("Se enviara una confirmacion de vida a todos los QP.\n");*/

            /*Busco hasta el final o hasta que el primero responda que puede atenderme*/
            while (ptrAux != NULL)
            {
                if (chequeoDeVida(ptrAux->info.ip, ptrAux->info.puerto) < 0)
                {
                    EliminarQuery(&listaHtml, ptrAux);
                    WriteLog(log, "Query Manager", getpid(), thr_self(), "Query Processor sin vida se a eliminado de la lista", "INFOFIN");
                    putchar('\n');
                    mensajeEsperando = 0;
                }

                ptrAux = ptrAux->sgte;
            }

            ptrAux = listaArchivos;

            /*Busco hasta el final o hasta que el primero responda que puede atenderme*/
            while (ptrAux != NULL)
            {
                if (chequeoDeVida(ptrAux->info.ip, ptrAux->info.puerto) < 0)
                {
                    EliminarQuery(&listaArchivos, ptrAux);
                    WriteLog(log, "Query Manager", getpid(), thr_self(), "Query Processor sin vida se a eliminado de la lista", "INFOFIN");
                    putchar('\n');
                    mensajeEsperando = 0;
                }

                ptrAux = ptrAux->sgte;
            }
        }
        else if (rc > 0)
        {
            mensajeEsperando = 0;
            desc_ready = rc;
            for (cli = 0; cli < fdMax+1 && desc_ready > 0; cli++)
            {
                if (FD_ISSET(cli, &fdLectura))
                {
                    desc_ready--;
                    if (cli == sockQM)
                    /*Nueva conexion detectada*/
                    {
                        /*Cliente*/
                        SOCKET sockCliente;
                        SOCKADDR_IN dirCliente;
                        int nAddrSize = sizeof(dirCliente);

                        /*Acepta la conexion entrante*/
                        sockCliente = accept(sockQM, (SOCKADDR *) &dirCliente, &nAddrSize);
                        if (sockCliente == INVALID_SOCKET)
                        {
                            WriteLog(log, "Query Manager", getpid(), thr_self(), "No se pudo conectar cliente", "ERROR");
                            continue;
                        }

                        /*Agrega cliente (Front-End o QP) y actualiza max*/
                        FD_SET (sockCliente, &fdMaestro);
                        if (sockCliente > fdMax)
                            fdMax = sockCliente;

                        sprintf (text, "Conexion aceptada de %s", inet_ntoa(dirCliente.sin_addr));
                        WriteLog(log, "Query Manager", getpid(), thr_self(), text, "INFOFIN");
                    }
                    else if (cli == 0) /*stdin*/
                    {
                        /*ATENDER INPUT CONSOLA*/
                        char input[MAX_PATH];
                        int c, i = 0;

                        memset(input, '\0', sizeof(input));
                        
                        while ((c = getchar()) != EOF && c != '\n')
                            input[i++] = c;
                        input[i] = '\0';

                        fflush(stdin);

                        if(strcmp(input, "-qpstatus") == 0)
                        {
                            int contador = 0;
                            imprimeLista(listaHtml, &contador);
                            imprimeLista(listaArchivos, &contador);
                            putchar('\n');
                        }

                        else if(strcmp(input, "-ranking-palabras") == 0)
                        {
                            imprimeListaRanking(listaPalabras);
                            putchar('\n');
                        }

                        else if(strcmp(input, "-ranking-recursos") == 0)
                        {
                            imprimeListaRanking(listaRecursos);
                            putchar('\n');
                        }

                        else if(strcmp(input, "-help") == 0)
                        {
                            printf("%s", STR_MSG_HELP);
                        }
                        else
                            printf("%s", STR_MSG_INVALID_INPUT);
                    }
                    else
                    /*Cliente detectado -> Si es QP colgar de lista, si es Front-End satisfacer pedido*/
                    {
                        void *buffer = NULL;
                        char descID[DESCRIPTORID_LEN];
                        unsigned long rtaLen = 0;
                        int control;
                        int mode = 0x00;

                        /*memset(buffer, '\0', sizeof(buffer));*/
                        memset(descID, '\0', sizeof(descID));

                        /*Recibir HandShake*/
                        WriteLog(log, "Query Manager", getpid(), thr_self(), "Se recibira handshake", "INFO");
                        if ((control = ircRequest_recv (cli, (void **)&buffer, &rtaLen, descID, &mode)) < 0)
                        {
                            WriteLog(log, "Query Manager", getpid(), thr_self(), "Error", "ERROR");
                            putchar('\n');
                        }
                        else
                        {
                            WriteLog(log, "Query Manager", getpid(), thr_self(), "Recibido OK", "INFOFIN");
                            if (mode == IRC_HANDSHAKE_QP)
                            /*Si es QP -> colgar de lista segun recurso atendido (payload)*/
                            {
                                int control;
                                struct query info;

                                WriteLog(log, "Query Manager", getpid(), thr_self(), "Se atendera nuevo Query Processor", "INFOFIN");

                                info.ip = inet_addr(strtok((char *)buffer, ":"));
                                info.puerto = htons(atoi(strtok(NULL, "-")));
                                info.tipoRecurso = atoi(strtok(NULL, ""));
                                info.consultasExito = 0;
                                info.consultasFracaso = 0;

                                WriteLog(log, "Query Manager", getpid(), thr_self(), "Se agregara a la lista", "INFO");
                                if (info.tipoRecurso == RECURSO_WEB)
                                {
                                    if ((control = AgregarQuery (&listaHtml, info)) < 0)
                                        WriteLog(log, "Query Manager", getpid(), thr_self(), "Error al agregar a lista Html", "ERROR");
                                }
                                else
                                {
                                    if ((control = AgregarQuery (&listaArchivos, info)) < 0)
                                        WriteLog(log, "Query Manager", getpid(), thr_self(), "Error al agregar a lista Archivos", "ERROR");
                                }
                                
                                if (control == 0)
                                    WriteLog(log, "Query Manager", getpid(), thr_self(), "Agregado a lista OK", "INFOFIN");
                                printf("Atencion de conexion de Query Processor finalizada.\n\n");
                            }
                            else if (mode == IRC_REQUEST_HTML || mode == IRC_REQUEST_ARCHIVOS || mode == IRC_REQUEST_CACHE)
                            /*Si es Front-End atender*/
                            {
                                int control;
                                WriteLog(log, "Query Manager", getpid(), thr_self(), "Se atendera Front-end", "INFOFIN");
                                control = atenderFrontEnd(cli, buffer, rtaLen, descID, mode, listaHtml, listaArchivos, &listaPalabras, &listaRecursos);
                                sprintf(text, "Atencion del Front-end finalizada%s", control < 0? " con Error": "");
                                WriteLog(log, "Query Manager", getpid(), thr_self(), text, control<0? "ERROR": "INFOFIN");
                            }

                            free(buffer);
                            
                            /*Eliminar cliente y actualizar nuevo maximo*/
                            close(cli);
                            FD_CLR(cli, &fdMaestro);
                            if (cli == fdMax)
                                while (FD_ISSET(fdMax, &fdMaestro) == 0)
                                    fdMax--;
                        }
                    }
                }
            }
        }
    }

    /*Cierra conexiones de Sockets*/
    for (cli = 0; cli < fdMax+1; ++cli) /*cerrar descriptores*/
        close(cli);

    /*Libera la memoria de la lista de Query Processors*/
    while (listaHtml != NULL)
        EliminarQuery(&listaHtml, listaHtml);
    while (listaArchivos != NULL)
        EliminarQuery(&listaArchivos, listaArchivos);
    while (listaPalabras != NULL)
        EliminarRanking(&listaPalabras, listaPalabras);
    while (listaRecursos != NULL)
        EliminarRanking(&listaRecursos, listaRecursos);

    return (EXIT_SUCCESS);
}