static void test_string_substring_until_end() {
	char *original = "hola mundo!";
	char *substring = string_substring_until(original, strlen(original));
	CU_ASSERT_STRING_EQUAL(substring, original);
	CU_ASSERT_PTR_NOT_EQUAL(substring, original);
	free(substring);
}
static void test_string_substring_until_middle() {
	char *original = "hola mundo!";
	char *substring = string_substring_until(original, 5);
	CU_ASSERT_STRING_EQUAL(substring, "hola ");
	CU_ASSERT_PTR_NOT_EQUAL(substring, original);
	free(substring);
}
char* obtenerDatoLimpioDelDiccionario(t_dictionary* diccionario, char* dato) {

	char* datoProvisorio;
	char* datoLimpio;
	datoProvisorio = dictionary_get(diccionario, dato);
	datoLimpio = string_substring_until(datoProvisorio,(string_length(datoProvisorio) - 1));
	return datoLimpio;
}
Exemple #4
0
char* depurarSentencia(char* sentencia){

		int i = strlen(sentencia);
		while (string_ends_with(sentencia, "\n")) {
			i--;
			sentencia = string_substring_until(sentencia, i);
		}
		return sentencia;

}
char* recuperarBloque(char* bloqueAVaciar){
	char* bloque = string_new();
	int i;

	for (i = 0; i < string_length(bloqueAVaciar); ++i) {
		if (bloqueAVaciar[i] == CARACTER_VACIO)
			break;
	}

	bloque = string_substring_until(bloqueAVaciar,i);

	return bloque;
}
Exemple #6
0
t_puntero obtenerPosicionVariable(t_nombre_variable identificador_variable){
	/*Se fija en el diccionario de variables la posicion la posicion va a ser el data del elemento*/
	identificador_variable = es_numero_pasar_char(identificador_variable);
	char *key = string_substring_until(&identificador_variable, 1);

	int32_t *dir_mem = dictionary_get(dic_Variables,key);
	int32_t ret = *dir_mem;

	if (dir_mem == NULL)
		printf("	ERROR no se ha podido encontrar la key:%s\n",key);

	txt_write_in_file(cpu_file_log, "La posicion de la variable\n");
	txt_write_in_file(cpu_file_log, "es\n");
	printf("	La posicion de la variable: %s, es %i\n", key, ret);
	free(key);
	return ret;
}
void list(char* line,t_list* lista)
{
	int credito;
	t_persona* persona = persona = malloc(sizeof(t_persona));
	char** array;

	array = string_split(line,";");
	strcpy(persona->region,array[0]);
	strcpy(persona->NomAp, array[1]);
	sscanf(array[2],"%d",&(persona->edad));
	sscanf(array[3],"%d",&(persona->Tel));
	sscanf(array[4],"%d",&(persona->DNI));
	sscanf(array[5],"%d",&credito);

	if (credito < 100)
	{
		log_info(logFile,string_substring_until(line,(strlen(line)-1)));
	}

	free(array);

	list_add(lista,persona);
}
Exemple #8
0
//Primitivas ANSISOP
t_puntero definirVariable(t_nombre_variable id_var){
	int32_t base, offset, tam;

	base = pcb->dir_seg_stack;
	offset= pcb->dir_cont_actual - base + (pcb->cant_var_cont_actual*5);
	tam = 5;

	int32_t pos_mem = base + offset;

	printf("	Definir la variable %c en la posicion %i, offset:%i\n",id_var, pos_mem,offset);
	id_var = es_numero_pasar_char(id_var);

	id_var = es_numero_pasar_char(id_var);
	char *key = string_substring_until(&id_var, 1);

	enviar_men_cpu_umv_destruir(ALM_BYTES, base, offset, tam, key);

	t_men_comun *r_alm = socket_recv_comun(socketUmv);

	if(r_alm->tipo == R_ALM_BYTES){
		int32_t *pos = malloc(sizeof(int32_t));
		*pos = pos_mem;
		dictionary_put(dic_Variables, key, pos);
		free(key);
		(pcb->cant_var_cont_actual) ++;
		txt_write_in_file(cpu_file_log, "Definiar la variable \n");
		txt_write_in_file(cpu_file_log, "en la posicion \n");
		destruir_men_comun(r_alm);
		return pos_mem;
	}else{
		finalizarContexto(SEGMEN_FAULT);
		destruir_men_comun(r_alm);
		free(key);
		return -1;
	}
}
int conectarAFilesystemYSubirArchivo(char *nombreArchivo, char *pathArchivoEnMDFS)
{
	ConfiguracionNodo *config = obtenerConfiguracionNodo();

	SocketConecta *conexion = newSocketConecta(config->ip_fs, config->puerto_fs);
	conectarAServidor(conexion);

	if (! estaConectado(conexion))
		return SUBIDA_FALLO;

	char pedidoSubidaArchivo = MENSAJE_PEDIDO_SUBIDA_ARCHIVO;
	enviarMensaje(conexion, &pedidoSubidaArchivo, 1);


	int contador = strlen(pathArchivoEnMDFS);
	while(pathArchivoEnMDFS[contador] != '/')
		contador--;

	char *pathDirectorio;
	if (contador == 0)
		pathDirectorio = "/";
	else
		pathDirectorio = string_substring_until(pathArchivoEnMDFS, contador);
	char *nombre = string_substring_from(pathArchivoEnMDFS, contador + 1);

	int longitudMensaje = strlen(pathDirectorio);
	enviarMensaje(conexion, &longitudMensaje, sizeof(int));
	enviarMensaje(conexion, pathDirectorio, longitudMensaje);

	longitudMensaje = strlen(nombre);
	enviarMensaje(conexion, &longitudMensaje, sizeof(int));
	enviarMensaje(conexion, nombre, longitudMensaje);


	char *pathEspacioTemporal = obtenerPathEspacioTemporal();
	char *rutaArchivo = malloc(strlen(pathEspacioTemporal) + strlen(nombreArchivo) + 2);
	strcpy(rutaArchivo, pathEspacioTemporal);
	strcat(rutaArchivo, "/");
	strcat(rutaArchivo, nombreArchivo);

	loguearYMostrarEnPantalla(LOG_LEVEL_INFO, "Subiendo archivo %s al MDFS en %s", rutaArchivo, pathArchivoEnMDFS);
	FILE *contenidoArchivo = fopen(rutaArchivo, "r");

	char buffer[SIZE_BLOQUE_DE_ENVIO + 1];
	size_t bytesLeidos = fread(buffer, 1, SIZE_BLOQUE_DE_ENVIO, contenidoArchivo);
	while(bytesLeidos > 0)
	{
		enviarTodo(conexion, buffer, bytesLeidos);
		bytesLeidos = fread(buffer, 1, SIZE_BLOQUE_DE_ENVIO, contenidoArchivo);

		char siguiente;
		recibirMensaje(conexion, &siguiente, 1);
	}

	int cero = 0;
	enviarMensaje(conexion, &cero, sizeof(int));

	char resultadoSubida;
	recibirMensaje(conexion, &resultadoSubida, 1);

	if (resultadoSubida == MENSAJE_SUBIDA_OK)
	{
		loguearYMostrarEnPantalla(LOG_LEVEL_INFO, "Subida de archivo %s al MDFS en %s finalizada", nombreArchivo, pathArchivoEnMDFS);
		return SUBIDA_OK;
	}

	loguearYMostrarEnPantalla(LOG_LEVEL_INFO, "Subida de archivo %s al MDFS en %s fallida", nombreArchivo, pathArchivoEnMDFS);
	return SUBIDA_FALLO;
}
void mensajesConPlataforma(int32_t socketEscucha) {//ATIENDE LA RECEPCION Y POSTERIOR RESPUESTA DE MENSAJES DEL ORQUESTADOR
	enum tipo_paquete unMensaje = PER_conexionNivel_ORQ;
	char* elMensaje=NULL;

	pthread_mutex_lock(&mutex_log);
	log_info(logger,"Voy a esperar recibir un mensaje de %d", socketEscucha);
	pthread_mutex_unlock(&mutex_log);

	pthread_mutex_lock(&mutex_mensajes); //(matyx)
	recibirMensaje(socketEscucha, &unMensaje,&elMensaje);
	pthread_mutex_unlock(&mutex_mensajes);

	sleep(1);

		pthread_mutex_lock(&mutex_log);
		log_info(logger, "Llego el tipo de paquete: %s .",obtenerNombreEnum(unMensaje));
		log_info(logger, "Llego este mensaje: %s .",elMensaje);
		pthread_mutex_unlock(&mutex_log);

		switch (unMensaje) {

			case PLA_movimiento_NIV: {//graficar y actualizar la lista RECIBE "@,1,3"

				char ** mens = string_split(elMensaje,",");

				char idPers = mens[0][0];


				if(huboCambios==true){

					pthread_mutex_lock(&mutex_log);
					log_info(logger,"envio los cambios de configuracion");
					pthread_mutex_unlock(&mutex_log);

					pthread_mutex_lock(&mutex_mensajes);
					enviarMensaje(socketDeEscucha, NIV_cambiosConfiguracion_PLA,buffer1);
					pthread_mutex_unlock(&mutex_mensajes);

					huboCambios=false;

					pthread_mutex_lock(&mutex_log);
					log_info(logger,"me preparo para recibir el ok");
					pthread_mutex_unlock(&mutex_log);

					pthread_mutex_lock(&mutex_mensajes);
					recibirMensaje(socketEscucha, &unMensaje,&elMensaje);
					pthread_mutex_unlock(&mutex_mensajes);

					pthread_mutex_lock(&mutex_log);
					log_info(logger,"deberia haber recibido el OK1");
					pthread_mutex_unlock(&mutex_log);

					if(unMensaje==OK1){
						pthread_mutex_lock(&mutex_log);
						log_info(logger,"ya envie el cambio de configuracion, y me dieron el ok");
						pthread_mutex_unlock(&mutex_log);

						if(existePersonajeEnListaItems(idPers)){

							pthread_mutex_lock(&mutex_listas);
							MoverPersonaje(items, idPers,atoi(mens[1]), atoi(mens[2]));
							pthread_mutex_unlock(&mutex_listas);

							pthread_mutex_lock(&mutex_log);
							log_info(logger, "El personaje %s se movio a %s %s ",mens[0],mens[1],mens[2]);
							pthread_mutex_unlock(&mutex_log);

							if(graficar)
								nivel_gui_dibujar(items,nombre);
							}

						pthread_mutex_lock(&mutex_mensajes);
						enviarMensaje(socketEscucha,NIV_movimiento_PLA,"0"); //"0" SI ES VALIDO
						pthread_mutex_unlock(&mutex_mensajes);


						} else {
							pthread_mutex_lock(&mutex_log);
							log_info(logger,"no recibi OK1,recibi cualquiera");
							pthread_mutex_unlock(&mutex_log);
						}
					} else {

						if(existePersonajeEnListaItems(idPers)){

							pthread_mutex_lock(&mutex_listas);
							MoverPersonaje(items, elMensaje[0],atoi(mens[1]), atoi(mens[2]));
							pthread_mutex_unlock(&mutex_listas);

							pthread_mutex_lock(&mutex_log);
							log_info(logger, "El personaje %s se movio a %s %s ",mens[0],mens[1],mens[2]);
							pthread_mutex_unlock(&mutex_log);

							if(graficar)
								nivel_gui_dibujar(items,nombre);
						}

						pthread_mutex_lock(&mutex_log);
						log_info(logger, "Confirmo que el personaje %s puede moverse",mens[0]);
						pthread_mutex_unlock(&mutex_log);

						pthread_mutex_lock(&mutex_mensajes);
						enviarMensaje(socketEscucha,NIV_movimiento_PLA,"0"); //"0" SI ES VALIDO
						pthread_mutex_unlock(&mutex_mensajes);

					}

				break;
			}
			case PLA_personajeMuerto_NIV:{ //RECIBE "@" MUERTE POR ENEMIGOS
				char id=elMensaje[0];
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));

				personaje = buscarPersonajeListaPersonajes(listaPersonajesRecursos,string_substring_until(elMensaje,1));

				pthread_mutex_lock(&mutex_listas);
//				liberarRecursosDelPersonaje(personaje->recursosActuales); // tambien suma sus recursos a disponible
				borrarPersonajeListaPersonajes(listaPersonajesRecursos,elMensaje);

				pthread_mutex_unlock(&mutex_listas);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El personaje %c ha muerto ",id);
				pthread_mutex_unlock(&mutex_log);



				break;
			}
			case PLA_nuevoPersonaje_NIV:{ //RECIBE "@" LA POSICION DE INICIO SERA SIEMPRE 0,0 POR LO QUE NO LA RECIBE


				char * simbolo = malloc(strlen(elMensaje)+1);
				strcpy(simbolo,elMensaje);

				pthread_mutex_lock(&mutex_listas);
				CrearPersonaje(items,elMensaje[0],0,0);
				pthread_mutex_unlock(&mutex_listas);

				//ACA CREO UNA LISTA DE PERSONAJES CON SUS RESPECTIVOS RECURSOS ASIGNADOS
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));
				personaje->simbolo = string_substring_until(elMensaje,1);
				personaje->recursosActuales = list_create();
				personaje->recursoBloqueante = string_new();
				personaje->posicion = posicion_create_pos(0,0);
				personaje->ingresoSistema = ingresoAlSistema;
				ingresoAlSistema++;

				pthread_mutex_lock(&mutex_listas);
				list_add(listaPersonajesRecursos,personaje);
				pthread_mutex_unlock(&mutex_listas);

				if(graficar)
					nivel_gui_dibujar(items,nombre);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El nuevo personaje %c se dibujo en el mapa",elMensaje[0]);
				pthread_mutex_unlock(&mutex_log);

				break;

			}
			case PLA_posCaja_NIV:{ // RECIBE "F" SI ESTA SOLICITANDO UNA FLOR, POR EJEMPLO

				char * pos = string_new();
				ITEM_NIVEL * caja = buscarRecursoEnLista(items, elMensaje);

				string_append(&pos, string_from_format("%d",caja->posx));
				string_append(&pos, ",");
				string_append(&pos, string_from_format("%d",caja->posy));

				pthread_mutex_lock(&mutex_log);
				log_info(logger,"enviare la posicion de la caja");
				pthread_mutex_unlock(&mutex_log);

				pthread_mutex_lock(&mutex_mensajes);
				enviarMensaje(socketEscucha, NIV_posCaja_PLA,pos); //"X,Y"
				pthread_mutex_unlock(&mutex_mensajes);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "Envio posicion del recurso %s coordenadas %s ",elMensaje,pos);
				pthread_mutex_unlock(&mutex_log);

				free(pos);
				break;

			}
			case PLA_solicitudRecurso_NIV:{ // LE CONTESTO SI EL RECURSOS ESTA DISPONIBLE




				// El mensaje de ejemplo es : "@,H"

				char * rta;
				bool hayRecurso = determinarRecursoDisponible (string_substring_from(elMensaje, 2)); //SI ESTA EL RECURSO TMB LO RESTA
				t_personaje_niv1 * pers = buscarPersonajeListaPersonajes(listaPersonajesRecursos, string_substring_until(elMensaje,1));

				if (hayRecurso){
					rta = "0";

					pthread_mutex_lock(&mutex_listas);
					list_add(pers->recursosActuales, string_substring_from(elMensaje, 2));
					pers->recursoBloqueante = string_new();

					pthread_mutex_unlock(&mutex_listas);

				}else{

					pthread_mutex_lock(&mutex_listas);
					pers->recursoBloqueante = string_substring_from(elMensaje, 2);
					rta = "1";
					pthread_mutex_unlock(&mutex_listas);
				}


				pthread_mutex_lock(&mutex_mensajes);
				enviarMensaje(socketEscucha, NIV_recursoConcedido_PLA,rta);//"0" CONCEDIDO, "1" NO CONCEDIDO
				pthread_mutex_unlock(&mutex_mensajes);

				break;
			}

			case PLA_personajesDesbloqueados_NIV:{//"5,@,#,....." recorro lista personaje recursos y actualizo recBloqueante a vacio
				char ** mens = string_split(elMensaje,",");
				int i;

				int cantPersonajes=atoi(mens[0]);
				for(i=1;i<=cantPersonajes;i++){
					char * unPersDesbloqueado=mens[i];

					t_personaje_niv1 * unPers=buscarPersonajeListaPersonajes(listaPersonajesRecursos,unPersDesbloqueado);

					pthread_mutex_lock(&mutex_listas);
					unPers->recursoBloqueante=string_new();
					pthread_mutex_unlock(&mutex_listas);

					pthread_mutex_lock(&mutex_log);
					log_info(logger, "Personajes %s desbloqueados",mens[i]);
					pthread_mutex_unlock(&mutex_log);

				}


				break;
			}

			case PLA_actualizarRecursos_NIV:{ //"3;F,1;C,3;....." actualizo la lista de recursos sumandole esas cantidades
				char ** mens = string_split(elMensaje,";");
				int cantRecursos= atoi(mens[0]);
				int i;
				pthread_mutex_lock(&mutex_log);
				log_info(logger, "Recursos desbloqueados: %s",elMensaje);
				pthread_mutex_unlock(&mutex_log);

				for(i=1;i<=cantRecursos;i++){
					char** mensajeIndividual= string_split(mens[i],",");
					pthread_mutex_lock(&mutex_listas);
					int cantidad=atoi(mensajeIndividual[1]);
					sumarRecurso(items, mensajeIndividual[0][0],cantidad);
					pthread_mutex_unlock(&mutex_listas);

					if(graficar)
						nivel_gui_dibujar(items,nombre);
				}


				break;
			}
			case PLA_nivelFinalizado_NIV:{  //recibe personaje que termino el nivel ej: "@"
				char id=elMensaje[0];
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));

				personaje = buscarPersonajeListaPersonajes(listaPersonajesRecursos,string_substring_until(elMensaje,1));

				pthread_mutex_lock(&mutex_listas);
	//			liberarRecursosDelPersonaje(personaje->recursosActuales);
				BorrarItem(items,id);
				borrarPersonajeListaPersonajes(listaPersonajesRecursos,elMensaje);
				pthread_mutex_unlock(&mutex_listas);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El personaje %c ha terminado el nivel ",id);
				pthread_mutex_unlock(&mutex_log);

				if(graficar){

					nivel_gui_dibujar(items,nombre);

				}

				break;
			}


			case PLA_perMuereInterbloqueo_NIV:{
				char id=elMensaje[0];
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));

				personaje = buscarPersonajeListaPersonajes(listaPersonajesRecursos,string_substring_until(elMensaje,1));

				pthread_mutex_lock(&mutex_listas);
//				liberarRecursosDelPersonaje(personaje->recursosActuales);
				BorrarItem(items,id);
				borrarPersonajeListaPersonajes(listaPersonajesRecursos,elMensaje);
				pthread_mutex_unlock(&mutex_listas);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El personaje %c ha muerto por interbloqueo ",id);
				pthread_mutex_unlock(&mutex_log);

				if(graficar)
					nivel_gui_dibujar(items,nombre);

				break;
			}

			case PLA_perMuereNaturalmente_NIV: {
				char id = elMensaje[0];
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));

				personaje = buscarPersonajeListaPersonajes(listaPersonajesRecursos,string_substring_until(elMensaje, 1));

				pthread_mutex_lock(&mutex_listas);
				liberarRecursosDelPersonaje(personaje->recursosActuales);
				BorrarItem(items, id);
				borrarPersonajeListaPersonajes(listaPersonajesRecursos, elMensaje);
				pthread_mutex_unlock(&mutex_listas);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El personaje %c ha muerto por causas externas", id);
				pthread_mutex_unlock(&mutex_log);

				if (graficar)
					nivel_gui_dibujar(items, nombre);

				break;
			}

			{
				default:
					pthread_mutex_lock(&mutex_log);
					log_info(logger, "Recibi mensaje inexistente, la ejecucion del nivel finalizara");
					pthread_mutex_unlock(&mutex_log);

					eliminarEstructuras();

					break;
			}


			free(elMensaje);

		}


}
//Recibe y procesa un mensaje recibido
void receiptMessage(void * arguments)
{
	args_receiptMessage * args = arguments;

	int numbytes;				/* bytes recibidos por cada lectura (0 = desconexion del cliente) */
	char buffer[MAXDATASIZE];	/* buffer de lectura */
	bool bufferUsed;			/* determina si se analizo por lo menos una vez un nuevo set de datos */

	unsigned int n = -1;		/* cantidad de argumentos del packete que recibo */
	int i = 0;					/* ayuda a saber la ultima posicion de lectura en el buffer (tambien se usa como i en otros casos) */
	int j = 0;					/* j de for */
	int seps = 0;				/* cantidad de separadores ,(coma) contados en el encabezado del paquete */
	char * packet_head;			/* encabezado del paquete */
	char * packet_body;			/* cuerpo del paquete */
	char * exceeded;			/* datos excedidos del final del paquete */
	char * str_tmp;				/* temporar para operaciones de string */
	bool isExceeded = false;	/* determina si hay datos excedidos cargados en el buffer */

	bool fullHead = false;		/* determina si ya fue recibido el encabezado del paquete */
	int bytesBody = 0;			/* determina los bytes que contendrá el cuerpo del paquete */
	char ** head = NULL;		/* encabezado divido por n, name y bytes de los args */
	char * b;					/* utilizado para extraer bytes del buffer */
	void (*fn)();				/* utilizado para guardar la funcion que hay que ejecutar del cliente */
	char ** packet_args;		/* Argumentos que se envian por la funcion */


	//loopeo
	while(1)
	{
		//si en la ultima lectura dejo informacion excedida la guardo
		if(isExceeded)
			exceeded = string_duplicate(buffer);

		//Pongo en blanco el buffer
		buffer[0] = '\0';

		//Espero a recibir un mensaje del job, si se produce un error lo informo error y finalizo hilo
		if ((numbytes=recv(args->connection->socket, buffer, MAXDATASIZE-1, 0)) == -1)
		{
			//perror("recv");
			break;
		}

		//si en la ultima lectura dejo informacion excedida la agrego al inicio del buffer
		if(isExceeded)
		{
			exceeded = string_new();
			string_append(&exceeded, buffer);

			buffer[sizeof(exceeded)] = '\0'; //mejor que memset?
			strcpy(buffer, exceeded);
			free(exceeded);
		}

		//finalizo el hilo
		if(numbytes == 0)
			break;

		else
		{
			//Corta el bufer hasta donde recibe informacion
			buffer[numbytes] = '\0';

			//analizo el buffer si es la primera vez que lo voy a analizar o si queda informacion excedida para seguir analizando
			//(Analizar significa, buscar paquetes completos y ejecutarlos)
			bufferUsed = false;
			while(!bufferUsed || isExceeded)
			{
				bufferUsed = true;
				isExceeded = false;
				i = 0;

				//si comienzo a leer un nuevo paquete inicializo el head y el body
				if(n == -1)
				{
					packet_head = string_new();
					packet_body = string_new();
				}

				//recorro buffer hasta armar cabezal si no esta armado
				if(!fullHead)
				{
					for(i = 0; i < strlen(buffer); i++)
					{
						b = buffer[i];

						//primer caracter es [n] (cantidad de args)
						if(n == -1)
							n = atoi(&b);
						//cuento comas
						else if(b == ',')
							seps++;

						//voy completando cabezal
						string_append(&packet_head, &b);

						//fianlizo cuando llego al ultimo separador
						if(n+2 == seps)
						{
							fullHead = true;
							i++; //dejo posicion en el primer byte del cuerpo del paquete
							break;
						}
					}
				}

				//cabezal completo
				if(fullHead)
				{
					//si el cabezal no fue explodiado, le doy explode y calculo los bytes del cabezal
					if(head == NULL)
					{
						//hago explode
						head = string_n_split(packet_head, n+2, ",");
						for(j = 2; j < n+2; j++)
							bytesBody += atoi(head[j]);
					}

					//Agrego al cuerpo del packete todos los datos
					str_tmp = string_substring_from(buffer, i);
					string_append(&packet_body, str_tmp);
					free(str_tmp);

					//paquete completo
					if(bytesBody <= strlen(packet_body))
					{
						//si el paquete esta excedido, corto el paquete en la posicion correspondiente y guardo el excedente sobre el buffer
						if(bytesBody < strlen(packet_body))
						{
							isExceeded = true;

							exceeded = string_substring_from(packet_body, bytesBody);
							str_tmp = string_substring_until(packet_body, bytesBody);
							free(packet_body);
							packet_body = str_tmp;

							buffer[0] = '\0';
							strcpy(buffer, exceeded);
							free(exceeded);
						}

						//llamo a la funcion que maneja los mensajes recibidos
						if(args->fns_receipts != NULL)
						{
							i = 0;

							//armo argumentos en array
							packet_args = malloc(sizeof(char*)*n);
							for(j = 2; j < n+2; j++)
							{
								char * part = string_substring(packet_body, i, atoi(head[j]));
								packet_args[j-2] = part;
								i += atoi(head[j]);
							}

							//Si n=0 el split no toma el vacio despues de la coma final.. quito ultima coma
							if(n==0)
								head[1][strlen(head[1])-1] = '\0';

							//Ejecuto la función solicitada, si no existe la función muestro error
							fn = dictionary_get(args->fns_receipts, head[1]);
							if(fn != NULL)
								fn(args->connection, packet_args);
							else
								printf("Cliente SOCK%d(%s:%d) intento ejecutar la función inexistente '%s'.\n", args->connection->socket, args->connection->ip, args->connection->port, head[1]);

							//libero argumentos
							for(i = 0; i < n; i++)
								free(packet_args[i]);
							free(packet_args);
						}

						free(packet_head);
						free(packet_body);
						for(i = 0; i < n+3; i++)
							free(head[i]);
						free(head);

						n = -1;
						seps = 0;
						fullHead = false;
						bytesBody = 0;
						head = NULL;
					}
				}
			}
		}
	}

	//cierro socket
	close(args->connection->socket);

	//Informo a la funcion que maneja los cierres (si existe y la estructura de conexion lo permite)
	if(args->connection->run_fn_connectionClosed && args->fn_connectionClosed != NULL)
		args->fn_connectionClosed(args->connection);

	//libero memoria
	if(isExceeded)
		free(exceeded);
	if(n != -1)
	{
		free(packet_head);
		free(packet_body);
	}
	free(args);
}