t_socket * crear_sock_nivel(void) { t_socket * sock; sock=malloc(sizeof(t_socket)); int puerto; //puerto=PUERTO; struct sockaddr_in dir_servidor; int servidor; servidor=crear_socket(); dir_servidor.sin_family = AF_INET; dir_servidor.sin_addr.s_addr = INADDR_ANY; //dir_servidor.sin_port = htons(PUERTO); dir_servidor.sin_port = 0; memset(&(dir_servidor.sin_zero), '\0', 8); sock->descriptor=servidor; sock->direccion=&dir_servidor; escuchar(*sock); /*while(escuchar(*sock)==EXIT_FAILURE) { puerto++; dir_servidor.sin_port=htons(puerto); }*/ return sock; }
void* escuchar_conexiones(void* otro_ente){ sock_t* socket_principal = crear_socket_escuchador(puerto()); escuchar(socket_principal); // Seteamos este como el socket mas grande int32_t mayor_fd = socket_principal->fd; FD_ZERO(&readfds); FD_SET(socket_principal->fd, &readfds); // Preparamos el SET fd_set readfdset = readfds; while(1){ // Escuchamos el universo int rs = select(mayor_fd+1, &readfdset, NULL, NULL, NULL); if(rs > 0){ // Si el socket se puede leer if(FD_ISSET(socket_principal->fd, &readfdset)){ sock_t* nueva_conexion = aceptar_conexion(socket_principal); pthread_t hilo_conexion; pthread_create(&hilo_conexion, NULL, &_atiendo_hilo_conexion, nueva_conexion); } } // Rearmamos el readfds readfdset = readfds; } return NULL; }
// Corre en un THREAD void* escuchar_conexiones_entrantes_y_procesos(void* un_ente) { sock_t* principal = crear_socket_escuchador(puerto()); escuchar(principal); // Seteamos el timer struct timeval timer; timer.tv_sec = 2; timer.tv_usec = 0; // Seteamos este como el socket mas grande int32_t mayor_fd = principal->fd; FD_ZERO(&READFDS_PROCESOS); FD_SET(principal->fd, &READFDS_PROCESOS); // Preparamos el SET fd_set readfds = READFDS_PROCESOS; while(1) { // Escuchamos el universo int rs = select(mayor_fd+1, &readfds, NULL, NULL, &timer); if(rs > 0) {// Podemos leer // Vemos si hay sockets para leer int32_t i; int32_t copia_mayor_fd = mayor_fd; for(i = 0; i < (copia_mayor_fd+1); i++) { // Si el socket se puede leer if(FD_ISSET(i, &readfds)) { if(i == principal->fd) {// Es el socket principal, new connection knocking sock_t* nueva_conexion = NULL; int32_t salida = _procesar_nueva_conexion(principal, &nueva_conexion); if(salida == 1) {// Es programa y salio all ok _recalcular_mayor_fd(&mayor_fd, nueva_conexion->fd); } else if(salida == 2) {// Es CPU // Aca el quehacer cuando la conexion es CPU _recalcular_mayor_fd(&MAYOR_FD_CPU, nueva_conexion->fd); } } else {// No es el socket principal, es un proceso _atender_socket_proceso(buscar_proceso_por_fd(i)); } } } } // Rearmamos el readfds readfds = READFDS_PROCESOS; // Reseteamos el timer timer.tv_sec = 2; timer.tv_usec = 0; } return NULL; }
main() { int sock_escucha = 0; // --> lo vamos a mantener todo el tiempo escuchando nuevas conexiones int new_socket = 0; // --> es el que va a aceptar la nueva conexion int exit = 1; // --> lo vamos a utilizar para salir del sistema int i,fdmax; // --> los utilizamos para recorrer todos los sockets //Los fd_set guardan informacion de los files descriptores (sock_escucha y new_socket //asi podemos tener un control de cuantos clientes hay conectados y quienes son cada uno fd_set read_fds; fd_set master; //ESCUCHAR--> Esta definida abajo, basicamente lo dividi solo hace el Bind y Listen para // el sock escucha sock_escucha=escuchar(); if(sock_escucha == -1) { printf("ERROR, error iniciando sockets. \n"); printf("ERROR, sock_escucha = %d \n", sock_escucha); return -1; } //Estas funciones estan mejor explicadas en la Guia Beej, pero basicamente //FD_ZERO --> limpia toda la "lista" de las conexiones que le pases los fd_set //FD_SET --> aƱade un file descriptor al fd_set que le pases //fdmax --> es una variable que la usamos para recorrer todos los sockets y saber cual es el max FD_ZERO (&master); FD_ZERO (&read_fds); FD_SET (sock_escucha, &master); fdmax=sock_escucha; //Bucle infitio para seguir aceptando conexiones while(exit==1) { //READ_FDS --> lee un file descriptor de la lista de fd_set read_fds = master; if (select(fdmax + 1, &read_fds, NULL, NULL, NULL) == -1) { printf("Error en funcion select"); return -1; } //Bucle por todos los sockets for (i = 0; i <= fdmax; i++) { //pregunto si en algun socket hubo algun cambio if (FD_ISSET(i, &read_fds)) { if (i == sock_escucha) { //si es la consola es porque el listen recibio una nueva conexion new_socket = escuchar_puerto(sock_escucha); if(new_socket == -1) { //si es -1 fallo asi que continuo descartando esta printf("No se pudo agregar una nueva conexion"); continue; } //lo agrego para que lo escuchen en el select FD_SET(new_socket, &master); //si es el mayor lo re asigno if(fdmax < new_socket) fdmax = new_socket; continue; } } } } }
void Vis_LCD ( volatile uint32_t Estado_LCD, volatile uint32_t AUX_LCD) { //volatile uint32_t Estado_LCD; //volatile uint32_t AUX_LCD; //Variable para el switch del E uint8_t a=1; //Estados de inicializacion y escritura uint8_t estado_0=0; uint8_t estado_1=0; uint8_t estado_2=0; uint8_t estado_3=0; uint8_t estado_4=0; uint8_t estado_5=0; uint8_t estado_6=0; //Contador de instrucciones LCD uint8_t cont_0=1; uint8_t cont_1=1; uint8_t cont_2=1; uint8_t cont_3=1; uint8_t cont_4=1; uint8_t cont_5=1; uint8_t cont_6=1; while(1) { if(t()==a) { ////inicio switch(Estado_LCD) { // corchete Estado_LCD // Bienvenido Key_PI case 0: //case 0 Estado_LCD switch(estado_0) { //switch(estado_0) case 0: lcd_iniciar(cont_0); cont_0=cont_0+1; if(cont_0==5)estado_0=estado_0+1; break; //break del case 0 case 1: titulo1(cont_0); cont_0=cont_0+1; if(cont_0==16)estado_0=estado_0+1; break; //break del case 1 default: if (cont_0==16) cont_0=16; } // end switch(estado_0) break; //break case 0 Estado_LCD // Elegir cancion case 1://case 1 Estado_LCD switch (estado_1) { // //switch(estado_1) case 0: lcd_iniciar(cont_1); cont_1=cont_1+1; if(cont_1==5)estado_1=estado_1+1; break; //break del case 0 case 1: song(cont_1); cont_1=cont_1+1; if(cont_1==21)estado_1=estado_1+1; break; //break del case 1 case 2: lcd_linea2(cont_1); cont_1=cont_1+1; if(cont_1==22)estado_1=estado_1+1; break; //break del case 2 case 3: switch(AUX_LCD) { case 0: song1(cont_1); //cancion 1 cont_1=cont_1+1; if(cont_1==25)estado_1=estado_1+1; break; //0 case 1: song2(cont_1); //cancion 2 cont_1=cont_1+1; if(cont_1==25)estado_1=estado_1+1; break; //1 case 2: song3(cont_1); //cancion 3 cont_1=cont_1+1; if(cont_1==25)estado_1=estado_1+1; break; //2 case 3: song4(cont_1); //cancion 4 cont_1=cont_1+1; if(cont_1==25)estado_1=estado_1+1; break; //3 case 4: song5(cont_1); //cancion 5 cont_1=cont_1+1; if(cont_1==25)estado_1=estado_1+1; break; //4 default: if (cont_1==25) cont_1=25; } // End switch AUX_LCD break; //break del case 3 } //switch(estado_1) break; //break case 1 Estado_LCD // //Case 2 Elegir nivel case 2: //case 2 Estado_LCD switch (estado_2) { // //switch(estado_2) case 0: lcd_iniciar(cont_2); cont_2=cont_2+1; if(cont_2==5)estado_2=estado_2+1; break; //break del case 0 case 1: elige(cont_2); cont_2=cont_2+1; if(cont_2==21)estado_2=estado_2+1; break; //break del case 1 case 2: lcd_linea2(cont_2); cont_2=cont_2+1; if(cont_2==22)estado_2=estado_2+1; break; //break del case 2 case 3: switch(AUX_LCD) { case 0: normal(cont_2); cont_2=cont_2+1; if(cont_2==25)estado_2=estado_2+1; break; //break del case 0 normal() case 1: experto(cont_2); cont_2=cont_2+1; if(cont_2==25)estado_2=estado_2+1; break; //break del case 1 experto default: if (cont_2==25) cont_2=25; } //end switch AUX_LCD break; //break del case 3 } //end switch(estado_2) break; // break //case 2 Estado_LCD // //Escuchar // Escuchar cancion case 3: //case 3 Estado_LCD switch(estado_3) { //switch(estado_3) case 0: lcd_iniciar(cont_3); cont_3=cont_3+1; if(cont_3==5)estado_3=estado_3+1; break; //break del case 0 case 1: escuchar(cont_3); cont_3=cont_3+1; if(cont_3==13)estado_3=estado_3+1; break; //break del case 1 default: if (cont_3==13) cont_3=13; } //end //switch(estado_3) break;//case 3 Estado_LCD // Preparado?????????????'''''' case 4: //case 4 Estado_LCD switch(estado_4) { //switch(estado_4) case 0: lcd_iniciar(cont_4); cont_4=cont_4+1; if(cont_4==5)estado_4=estado_4+1; break; //break del case 0 case 1: preparado(cont_4); cont_4=cont_4+1; if(cont_4==14)estado_4=estado_4+1; break; //break del case 1 default: if (cont_4==14) cont_4=14; } //end //switch(estado_4) break;//case 4 Estado_LCD // Adelante case 5: //case 5 Estado_LCD switch(estado_5) { //switch(estado_5) case 0: lcd_iniciar(cont_5); cont_5=cont_5+1; if(cont_5==5)estado_5=estado_5+1; break; //break del case 0 case 1: adelante(cont_5); cont_5=cont_5+1; if(cont_5==14)estado_5=estado_5+1; break; //break del case 1 default: if (cont_5==14) cont_5=14; } //end //switch(estado_5) break;//case 5 Estado_LCD //Again case 6: //case 6 Estado_LCD switch (estado_6) { // //switch(estado_6) case 0: lcd_iniciar(cont_6); cont_6=cont_6+1; if(cont_6==5)estado_6=estado_6+1; break; //break del case 0 case 1: again(cont_6); cont_6=cont_6+1; if(cont_6==21)estado_6=estado_6+1; break; //break del case 1 case 2: lcd_linea2(cont_6); cont_6=cont_6+1; if(cont_6==22)estado_6=estado_6+1; break; //break del case 2 case 3: switch(AUX_LCD) { case 0: si(cont_6); cont_6=cont_6+1; if(cont_6==26)estado_6=estado_6+1; break; //break del case 0 normal() case 1: no(cont_6); cont_6=cont_6+1; if(cont_6==26)estado_6=estado_6+1; break; //break del case 1 experto default: if (cont_6==26) cont_6=26; } //end switch AUX_LCD break; //break del case 3 } //end switch(estado_6) break; // break //case 6 Estado_LCD default: if (cont_6==0) cont_6=0; // } //corchete Estado_LCD //fin del switch estado LCD a=0; } if(t()==0) a=1; } //return 0; } //end main
int main (int argc, char* argv[]) { int error,i,j,ronda; int fdcliente; key_t llave,llaved,llavedx,llavedy; struct paketeSC packout; signal(SIGINT,terminar); //Valores por default cant_niveles=10; dificultad=5; bots=0; switch(argc) { case 1: printf("Servidor de NkTron\nERROR: Faltan parametros\n"); printf("Uso: servidor Cant_Jugadores [Dificultad][Rondas][Bots]\n"); printf(" Cant_Jugadores=2..6 , Dificultad=1..10 (0=Especial) , "); printf("Rondas=1..20 , Bots=1..6\n"); return 1; break; case 5: bots=atoi(argv[4]); if (bots<0 || bots >MAX_JUGADORES) { printf("Cantidad de bots invalida (0..%d)\n",MAX_JUGADORES); return 1; } case 4: cant_niveles=atoi(argv[3]); if (cant_niveles<1 || cant_niveles>20) { printf("Cantidad de rondas invalida (1..20)\n"); return 1; } case 3: dificultad=atoi(argv[2]); if (dificultad<0 || dificultad>10) { printf ("Dificultad invalida (0..10) (0=Especial)\n"); return 1; } case 2: jugadores=atoi(argv[1]); if (jugadores<2 || jugadores>MAX_JUGADORES) { printf("Cantidad de jugadores invalida (2..%d)\n",MAX_JUGADORES); return 1; } } if (bots>jugadores) { printf("Cantidad de bots invalida, mayor a jugadores totales\n"); return 1; } llave=ftok("./cliente.c",33); id_mem=shmget(llave,sizeof(int[80][23]),0777 | IPC_CREAT); if(id_mem==-1) { printf("No consegui memoria!\n");return 1; } shmatriz=(int **)shmat(id_mem,(char *)0,0); if(!shmatriz) { printf("No consegui compartir memoria!\n");return 1; } shmatriz=(int **)matriz; llaved=ftok("./cliente.c",32); id_memd=shmget(llaved,sizeof(int[MAX_JUGADORES]),0777 | IPC_CREAT); if(id_memd==-1) { printf("No consegui memoria!\n");return 1; } direcc=(int *)shmat(id_memd,(char *)0,0); if(!direcc) { printf("No consegui compartir memoria!\n");return 1; } llavedx=ftok("./cliente.c",31); id_memdx=shmget(llavedx,sizeof(int[MAX_JUGADORES]),0777 | IPC_CREAT); if(id_memdx==-1) { printf("No consegui memoria!\n");return 1; } x=(int *)shmat(id_memdx,(char *)0,0); if(!x) { printf("No consegui compartir memoria!\n");return 1; } llavedy=ftok("./cliente.c",30); id_memdy=shmget(llavedy,sizeof(int[MAX_JUGADORES]),0777 | IPC_CREAT); if(id_memdy==-1) { printf("No consegui memoria!\n");return 1; } y=(int *)shmat(id_memdy,(char *)0,0); if(!y) { printf("No consegui compartir memoria!\n");return 1; } printf("Servidor de NkTron listo y esperando conexiones...\n"); printf("Se jugaran %d rondas con nivel de dificultad %d\n",cant_niveles,dificultad); printf("Jugaran %d jugadores, de los cuales %d seran bots\n\n",jugadores,bots); for(i=0;i<MAX_JUGADORES;i++) { strcpy(vnombres[i],"NULL"); puntajes[i]=0; } fdlisten=escuchar(PUERTO); if(fdlisten==-1) { printf ("No se pudo abrir puerto para escuchar\n"); return -1;; } for(i=0;i<bots;i++) { //crear proceso de bot llave=ftok("./cliente.c",40+i); sembot[i]=obtenersem(llave); iniciasem(sembot[i],0); //1=verde cont_clientes++; strcpy(vnombres[i],"<Bot>"); if ( (j=fork())==0 ) { char param[5]; sprintf(param,"%d",i); char * args[] = { "bot", param , NULL }; execv("bot",args); } } while (cont_clientes<jugadores) { fdcliente=aceptar(fdlisten); if(fdcliente==-1) { printf ("no se pudo accept()\n"); return -1; } cont_clientes++; error=pthread_create (&clientes[cont_clientes-1],NULL,atender,(void *)&fdcliente); if (error) //printf ("no se pudo crear el hilo %ld", (long)clientes[cont_clientes-1]); //printf ("no se pudo crear el hilo %d", clientes[cont_clientes-1]); printf ("no se pudo crear el hilo %d", cont_clientes-1); } sleep(2); printf ("Comenzando la partida...\n"); //enviar a todos el pakete I for(i=bots;i<jugadores;i++) { packout.cabecera='I'; packout.cantniv=cant_niveles; for(j=0;j<MAX_JUGADORES;j++) strcpy(packout.nombre[j],vnombres[j]); packout.nrojugador=i+1; enviar (fdclientes[i],(void*)&packout,sizeof(packout)); } sleep(2); for(ronda=1;ronda<cant_niveles+1;ronda++) { //enviar a todos el pakete N packout.cabecera='N'; packout.cantniv=ronda; //establecer posiciones y direcciones iniciales switch (jugadores) { case 2: direcc[0]=2;x[0]=6;y[0]=6; direcc[1]=4;x[1]=70;y[1]=18; break; case 3: direcc[0]=2;x[0]=4;y[0]=4; direcc[1]=4;x[1]=76;y[1]=4; direcc[2]=4;x[2]=72;y[2]=20; break; case 4: direcc[0]=3;x[0]=37;y[0]=4; direcc[1]=4;x[1]=76;y[1]=12; direcc[2]=1;x[2]=37;y[2]=20; direcc[3]=2;x[3]=4;y[3]=12; break; case 5: direcc[0]=2;x[0]=4;y[0]=4; direcc[1]=4;x[1]=75;y[1]=4; direcc[2]=2;x[2]=4;y[2]=20; direcc[3]=4;x[3]=75;y[3]=20; direcc[4]=1;x[4]=37;y[4]=16; break; case 6: direcc[0]=2;x[0]=4;y[0]=4; direcc[1]=4;x[1]=75;y[1]=4; direcc[2]=2;x[2]=4;y[2]=20; direcc[3]=4;x[3]=75;y[3]=20; direcc[4]=2;x[4]=8;y[4]=12; direcc[5]=4;x[5]=71;y[5]=12; } llenardatos(&packout); for(i=bots;i<jugadores;i++) { enviar(fdclientes[i],(void*)&packout,sizeof(packout)); } printf("Empieza ronda %d...\n",ronda); limpiamatriz(); ganador=0; sleep(3); while(alguienvive()) { for(i=0;i<bots;i++) semverde(sembot[i]); if (dificultad==0) usleep(300000/ronda); else usleep(500000/dificultad); //cuando se cumple el tiempo procesarmovimientos(); if(!alguienvive()) break; fflush(stdout); packout.cabecera='S'; llenardatos(&packout); //for(i=0;i<jugadores;i++) //printf("%d: <%d,%d;%d> ",i,x[i],y[i],direcc[i]); //printf("\n"); for(i=bots;i<jugadores;i++) { enviar(fdclientes[i],(void*)&packout,sizeof(packout)); } } packout.cabecera='F'; //Fin de ronda packout.ganador=ganador; for(i=0;i<jugadores;i++) packout.puntajes[i]=puntajes[i]; for(i=bots;i<jugadores;i++) { enviar(fdclientes[i],(void*)&packout,sizeof(packout)); } sleep(5); } printf("FIN DE JUEGO\n"); for (i=bots;i<jugadores;i++) pthread_join (clientes[i], NULL ); printf("Eliminando hilos...\n");fflush(stdout); terminar(); return 0; }
/* ============================================================================ Funcion principal ============================================================================ */ int main(int argc, char *argv[]) { stHeaderIPC *unHeaderIPC = NULL, *stHeaderSwitch = NULL; stMensajeIPC unMensaje; stPCB *unPCB = NULL; t_UMCConfig UMCConfig; pthread_t p_thread, p_threadCpu; char* temp_file = "nucleo.log"; elEstadoActual.path_conf = argv[1]; uint32_t pid_desconectado = 0; int unCliente = 0, maximoAnterior = 0, unSocket, agregarSock; struct sockaddr addressAceptado; /*Inicializacion de las colas del planificador*/ inicializar_pidCounter(); inicializar_cola_ready(); listaBlock = list_create(); consola_crear_lista(); log_create(temp_file, "NUCLEO", -1, LOG_LEVEL_INFO); log_info("Arrancando el Nucleo"); if (elEstadoActual.path_conf == NULL) { log_error("Falta el parametro de configuracion"); exit(-1); } /*Carga del archivo de configuracion*/ if (loadInfo(&elEstadoActual, 0)) { log_error("Error al cargar la configuracion"); exit(-2); } log_info("Configuracion cargada satisfactoriamente..."); /*Se lanza el thread para identificar cambios en el archivo de configuracion*/ pthread_create(&p_thread, NULL, &monitor_configuracion, (void*) &elEstadoActual); inicializarThreadsDispositivos(&elEstadoActual); /*Inicializacion de listas de socket*/ FD_ZERO(&(fds_master)); FD_ZERO(&(read_fds)); /*Inicializacion de socket de escucha*/ elEstadoActual.salir = 0; elEstadoActual.sockEscuchador = -1; /*Iniciando escucha en el socket escuchador de Consola*/ elEstadoActual.sockEscuchador = escuchar(elEstadoActual.miPuerto); FD_SET(elEstadoActual.sockEscuchador, &(fds_master)); log_debug("Se establecio conexion con el socket de escucha..."); /*Seteamos el maximo socket*/ elEstadoActual.fdMax = elEstadoActual.sockEscuchador; /*Conexion con el proceso UMC*/ log_debug("Estableciendo conexion con la UMC..."); elEstadoActual.sockUmc = conectar(elEstadoActual.ipUmc, elEstadoActual.puertoUmc); if (elEstadoActual.sockUmc != -1) { //FD_SET(elEstadoActual.sockUmc, &(fds_master)); unHeaderIPC = nuevoHeaderIPC(ERROR); if (!recibirHeaderIPC(elEstadoActual.sockUmc, unHeaderIPC)) { log_error("UMC handshake error - No se pudo recibir mensaje de respuesta"); log_error("No se pudo conectar a la UMC"); elEstadoActual.salir = 1; } if (unHeaderIPC->tipo == QUIENSOS) { unHeaderIPC = nuevoHeaderIPC(CONNECTNUCLEO); if (!enviarHeaderIPC(elEstadoActual.sockUmc, unHeaderIPC)) { log_error("UMC handshake error - No se pudo enviar mensaje de conexion"); log_error("No se pudo conectar a la UMC"); elEstadoActual.salir = 1; } } liberarHeaderIPC(unHeaderIPC); unHeaderIPC = nuevoHeaderIPC(OK); if (!recibirHeaderIPC(elEstadoActual.sockUmc, unHeaderIPC)) { log_error("UMC handshake error - No se pudo recibir mensaje de confirmacion"); log_error("No se pudo conectar a la UMC"); elEstadoActual.salir = 1; } else { if (recibirConfigUMC(elEstadoActual.sockUmc, &UMCConfig)) { log_error("UMC error - No se pudo recibir la configuracion"); close(unCliente); exit(-2); } agregar_master(elEstadoActual.sockUmc,maximoAnterior); log_info("Paginas por proceso:[%d]", UMCConfig.paginasXProceso); log_info("Tamanio de pagina:[%d]", UMCConfig.tamanioPagina); elEstadoActual.tamanio_paginas = UMCConfig.tamanioPagina; } liberarHeaderIPC(unHeaderIPC); } else { log_error("No se pudo conectar a la UMC"); elEstadoActual.salir = 1; } /*Ciclo Principal del Nucleo*/ log_info("............................................................................."); log_info("..............................Esperando Conexion.............................\n\n"); fflush(stdout); while (elEstadoActual.salir == 0) { read_fds = fds_master; if (seleccionar(elEstadoActual.fdMax, &read_fds, 0) == -1) { log_error("Error Preparando el Select"); break; } for (unSocket = 0; unSocket <= elEstadoActual.fdMax; unSocket++) { if (FD_ISSET(unSocket, &read_fds)) { /*Nueva conexion*/ if (unSocket == elEstadoActual.sockEscuchador) { unCliente = aceptar(elEstadoActual.sockEscuchador, &addressAceptado); unHeaderIPC = nuevoHeaderIPC(QUIENSOS); if (!enviarHeaderIPC(unCliente, unHeaderIPC)) { log_error("Cliente Handshake error - No se puede enviar el mensaje QUIENSOS"); liberarHeaderIPC(unHeaderIPC); close(unCliente); break;/*Sale del for*/ } liberarHeaderIPC(unHeaderIPC); unHeaderIPC = nuevoHeaderIPC(ERROR); if (!recibirHeaderIPC(unCliente, unHeaderIPC)) { log_error("Cliente Handshake error - No se puede recibir el mensaje"); liberarHeaderIPC(unHeaderIPC); close(unCliente); break;/*Sale del for*/ } /*Identifico quien se conecto y procedo*/ switch (unHeaderIPC->tipo) { case CONNECTCONSOLA: stHeaderSwitch = nuevoHeaderIPC(OK); if (!enviarHeaderIPC(unCliente, stHeaderSwitch)) { log_error("Handshake Consola - No se pudo enviar el OK"); liberarHeaderIPC(stHeaderSwitch); close(unCliente); break;/*Sale del switch*/ } liberarHeaderIPC(stHeaderSwitch); log_info("Nueva consola conectada"); agregarSock = 1; /*Agrego el socket conectado a la lista Master*/ if (agregarSock == 1) { agregar_master(unCliente, maximoAnterior); agregarSock = 0; } /* Recibo Programa */ if (!recibirMensajeIPC(unCliente, &unMensaje)) { log_error("No se puede recibir el programa a procesar"); break;/*Sale del switch*/ } else { if (unMensaje.header.tipo == SENDANSISOP) { /*metadata_desde_literal hace un malloc adentro*/ int cantidadDePaginasCodigo = calcular_cantidad_paginas(unMensaje.header.largo, UMCConfig.tamanioPagina); /***Creacion del PCB***/ unPCB = crear_pcb(unCliente, cantidadDePaginasCodigo, elEstadoActual.stackSize, &unMensaje); if (unPCB == NULL) { log_error("Error al crear el PCB... se cierra la consola\n"); quitar_master(unCliente, maximoAnterior); close(unCliente); break;/*Sale del switch*/ } if (inicializar_programa(unPCB, (char *)unMensaje.contenido, elEstadoActual.sockUmc) == EXIT_FAILURE) { log_error("No se pudo inicializar el programa"); quitar_master(unCliente, maximoAnterior); close(unCliente); break;/*Sale del switch*/ } /* Inicializada la consola la agrego a consolas activas */ agregar_consola(unCliente, unPCB->pid); /*Cuando se usa mensajeIPC liberar el contenido*/ free(unMensaje.contenido); ready_productor(unPCB); log_info("PCB [PID - %d] NEW a READY\n", unPCB->pid); fflush(stdout); } } break; case CONNECTCPU: stHeaderSwitch = nuevoHeaderIPC(OK); if (!enviarHeaderIPC(unCliente, stHeaderSwitch)) { liberarHeaderIPC(stHeaderSwitch); log_error("CPU error - No se pudo enviar OK"); close(unCliente); break;/*Sale del switch*/ } liberarHeaderIPC(stHeaderSwitch); if (pthread_create(&p_threadCpu, NULL, (void*) consumidor_cpu, (void*) &unCliente) != 0) { log_error("No se pudo lanzar el hilo correspondiente al cpu conectado"); close(unCliente); break;/*Sale del switch*/ } log_info("Se lanza hilo de atencion a CPU conectado"); fflush(stdout); break; default: break; } if (unHeaderIPC != NULL) { liberarHeaderIPC(unHeaderIPC); } } else { /*Conexion existente*/ log_debug("Recibi otro evento de un cliente ya conectado"); if (!recibirMensajeIPC(unSocket, &unMensaje)) { log_info("Desconexion detectada"); // Desconexion de una consola pid_desconectado = borrar_consola(unSocket); // Desconexion de la UMC if (unSocket == elEstadoActual.sockUmc) { log_info("Se perdio conexion con la UMC..."); elEstadoActual.salir = 1; cerrarSockets(&elEstadoActual); } if (unSocket == elEstadoActual.sockEscuchador) { log_debug("Se perdio conexion..."); } /*Saco el socket de la lista Master*/ quitar_master(unSocket, maximoAnterior); fflush(stdout); } } } } } destruir_planificador(); destruir_lista_dispositivos(&elEstadoActual); consola_destruir_lista(&elEstadoActual); cerrarSockets(&elEstadoActual); finalizarSistema(&unMensaje, unSocket, &elEstadoActual); log_info("Fin del programa"); return 0; }