void pdvsa_prog_1(char *host) { CLIENT *clnt; char * *result_1; char * preguntar_1_arg; ticket *result_2; desafio responder_1_arg; int *result_3; pase pedir_gasolina_1_arg; int *result_4; pase pedir_tiempo_1_arg; #ifndef DEBUG clnt = clnt_create (host, PDVSA_PROG, PDVSA_VER, "udp"); if (clnt == NULL) { clnt_pcreateerror (host); exit (1); } #endif /* DEBUG */ result_1 = preguntar_1(&preguntar_1_arg, clnt); if (result_1 == (char **) NULL) { clnt_perror (clnt, "call failed"); } result_2 = responder_1(&responder_1_arg, clnt); if (result_2 == (ticket *) NULL) { clnt_perror (clnt, "call failed"); } result_3 = pedir_gasolina_1(&pedir_gasolina_1_arg, clnt); if (result_3 == (int *) NULL) { clnt_perror (clnt, "call failed"); } result_4 = pedir_tiempo_1(&pedir_tiempo_1_arg, clnt); if (result_4 == (int *) NULL) { clnt_perror (clnt, "call failed"); } #ifndef DEBUG clnt_destroy (clnt); #endif /* DEBUG */ }
int main(int argc, char *argv[]){ char nombre[MAX_LONG]; // Nombre de esta Bomba char *nombre_pointer= &nombre[0]; // para poder enviarlo por RPC int capMax; // Capacidad Máxima (Litros) char archivo[MAX_LONG]; // Nombre de archivo "DNS" // Datos de los servidores char* nombres[MAX_SERVERS]; char* direcciones[MAX_SERVERS]; int tiempos[MAX_SERVERS]; //tiempos de respuesta CLIENT *clnts[MAX_SERVERS]; // Validar y obtener argumentos del cliente argumentos_cliente(argc,argv,nombre,&inventario,&consumo,&capMax,archivo); obtener_lista_dns(archivo, nombres,direcciones); // creacion del archivo LOG del cliente char nombre_LOG[MAX_LONG]; sprintf(nombre_LOG,"log_%s.txt",nombre); LOG = fopen(nombre_LOG,"w"); fprintf(LOG,"Inventario inicial %d \n ", inventario); if(inventario == 0) fprintf(LOG,"Tanque vacio: 0 minutos \n"); if(inventario == capMax) fprintf(LOG,"Tanque full: 0 minutos \n"); // PEDIR TIEMPOS int k = 0; while ((direcciones[k]) != NULL){ clnts[k]= clnt_create (direcciones[k], SERVICIOPDVSA, SERVICIOPDVSAVERS, "tcp"); if(clnts[k] == NULL){ clnt_pcreateerror( direcciones[k] ); tiempos[k] = 500; k = k + 1; continue; } int *result = pedir_tiempo_1(NULL,clnts[k]); if ( result == (int *)NULL){ clnt_perror( clnts[k], "Error al conectar con servidor"); tiempos[k] = 500; }else{ tiempos[k]= *result; } k = k + 1; } // ORDENAR EL ARREGLO DE TIEMPOS y TODOS LOS DEMAS int i = 0 ; int minimo; int j; while (nombres[i]!=NULL){ minimo = i; j = i + 1; while (nombres[j]!=NULL){ if (tiempos[j] < tiempos[minimo]){ minimo = j; } j = j +1; } swap(&tiempos[i],&tiempos[minimo]); swapLetras(&nombres[i],&nombres[minimo]); swapLetras(&direcciones[i],&direcciones[minimo]); swapPointer(&clnts[i],&clnts[minimo]); i=i+1; } // Iniciar contador de tiempo pthread_t contador_tiempo; int tiempo = 0; pthread_create(&contador_tiempo,NULL,llevar_tiempo,&tiempo); /**** INICIO DE LA SIMULACION ****/ int r = 0; while (tiempo <= 480){ //Iterar sobre los servidores pidiendo gasolina if(direcciones[r] == NULL){ // Si llegamos al final de la lista, reiniciar. r = 0; usleep(100000); } if ((capMax-inventario)>=38000){ // Verificar si el servidor no respondió al pedir tiempos if (tiempos[r] == 500){ r = r +1; continue; } // Pedir gasolina al servidor num r, almacenar respuesta en buffer gasolina char gasolina[20]; char **result2 = pedir_gasolina_1( &nombre_pointer, clnts[r] ); if ( result2 == (char **)NULL){ clnt_perror( clnts[r], "Error al conectar con servidor"); r = r+1; continue; }else{ strcpy(gasolina,*result2); } // Procesar respuesta del servidor if (strcmp(gasolina,"noDisponible") == 0){ fprintf(LOG,"Peticion: %d minutos, %s , No disponible, %d litros \n", tiempo, nombres[r],inventario); // Pedir gasolina al siguiente servidor en la lista r = r + 1; continue; // si su ticket no esta vigente o no tiene ticket } else if ( strcmp(gasolina,"noTicket") == 0 ){ int *retoInt = pedir_reto_1(NULL,clnts[r]); // convertir el reto de int a string char retoStr[10]; sprintf(&retoStr[0],"%d",*retoInt); // Aplicar el algoritmo MD5 unsigned char respUChar[16]; MDString (&retoStr[0],&respUChar[0]); // Convertir la respuesta a String char respString[33]; int i; for(i = 0; i < 16; ++i) sprintf(&respString[i*2], "%02x", (unsigned int)respUChar[i]); // Para que RPC nos permita pasarlo como argumento char *respStr= (char*) &respString[0]; int *resp = enviar_respuesta_1(&respStr, clnts[r]); if ( *resp == -1){ fprintf(LOG,"Autenticacion Fallida \n"); r = r + 1; continue; }else{ fprintf(LOG,"Autenticacion Correcta\n"); continue; } } else { // El ticket aun sigue vigente . Esperar y recibir gasolina. fprintf(LOG,"Peticion: %d minutos, %s, OK, %d litros \n", tiempo, nombres[r],inventario); usleep((tiempos[r]+1)*100000); pthread_mutex_lock(&mutex); inventario = inventario + 38000; pthread_mutex_unlock(&mutex); fprintf(LOG,"Llegada Gandola: %d minutos, %d litros \n", tiempo,inventario); if (inventario==capMax){ fprintf(LOG,"Tanque Full: %d minutos\n",tiempo);} // Reiniciar la busqueda de servidores activos r = 0; } }// fin del if (que verifica si se necesita gasolina) }// Fin del while (Se acabó el tiempo) fclose(LOG); return 0; }