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