//------------------------------------------------------------------------------------------ // ---------------------------------- atender_conexion_CPU -------------------------------- // Funcion que correra en un unico thread encargado de aceptar conexiones entrantes y generara // un thread por cada CPU conectado y liberaran recursos automaticamente cuando dejen de ser utiles. //------------------------------------------------------------------------------------------ void *atender_conexion_CPU(){ log_debug(logger, "Crear socket para CPUs"); // Crear socket para CPU ------------------------------ serverPaCPU = crearServer(reg_config.puerto_cpu); //Pongo el server a escuchar. ponerServerEscucha(serverPaCPU); log_debug(logger, "Se han empezado a escuchar cpus."); pthread_attr_t attr; pthread_t thread_cpu_con; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); temp = list_create(); int seguir = 1; while(seguir){ int* socket_nuevo = malloc(sizeof(int)); //socket donde va a estar nueva conexion struct sockaddr_in direccionEntrante; aceptarConexion(socket_nuevo, serverPaCPU.socketServer, &direccionEntrante); //No hace falta chekear si es -1, aceptarConexiones lo hace ya log_debug(logger, "Se ha conectado una CPU"); int proceso = pthread_create(&thread_cpu_con , &attr ,atender_CPU, socket_nuevo); if( proceso < 0) { log_debug(logger, "No fue posible crear thread p/ CPU"); exit(EXIT_FAILURE); } //No lo destruyo total todos usan el mismo atributo asi no lo creo todo el tiempo //pthread_attr_destroy(&attr); log_debug(logger, "CPU %d atendido", *socket_nuevo); //agrego CPU a la lista de disponibles // pthread_mutex_lock(&sem_l_cpus_dispo); // sem_post(&sem_cpus_dispo); // pthread_mutex_unlock(&sem_l_cpus_dispo); } return NULL; }
int multiplexarSockets(t_socket_servidor* servidor,struct timeval* tiempoEspera,t_log* logger) { fd_set descriptores; int sock,i; FD_ZERO(&descriptores); FD_SET(servidor->sock->idSocket,&descriptores); for(i = 0;i < MAX_CLIENTES;i++) { sock = servidor->sockClientes[i]; if(sock) FD_SET(sock,&descriptores); } log_debug(logger,"Atendiendo clientes..."); int actividad = select(MAX_CLIENTES + 3,&descriptores,NULL,NULL,tiempoEspera); if(actividad < 0) //error { perror("Error en la multiplexacion de I/O"); log_error(logger,"Error en la multiplexacion de clientes."); exit(EXIT_FAILURE); } log_debug(logger,"Verificando tipo de actividad..."); if(actividad == 0) //fin de tiempo de espera return -2; if(FD_ISSET(servidor->sock->idSocket,&descriptores)) //actividad en el servidor = pedido de conexion { t_socket_cliente* nuevoSocket; nuevoSocket = aceptarConexion(servidor,logger); for(i = 0;i < MAX_CLIENTES;i++) { sock = servidor->sockClientes[i]; if(sock == 0) { servidor->sockClientes[i] = nuevoSocket->sock->idSocket; i = MAX_CLIENTES; } } return 0; } for(i = 0;i < MAX_CLIENTES;i++) //actividad en alguno de los clientes = mensaje { sock = servidor->sockClientes[i]; if(FD_ISSET(sock,&descriptores)) { break; } } return sock; //devuelve 0 si es conexion nueva //-2 si termino el tiempo de espera //NRO DE SOCKET si hay un mensaje }