Пример #1
0
//------------------------------------------------------------------------------------------
// ---------------------------------- 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;
}
Пример #2
0
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
}