コード例 #1
0
void init(){

	LOGGER = log_create(LOG_PATH, "MaRTA", true, LOG_LEVEL_DEBUG);
	CONF = config_create(CONF_PATH); //HACK estaba mal el nombre de la funcion o no la encontraba o no se

	if(LOGGER == NULL){
		perror("ERROR! no pudo levantar ni el log!");
		exit(EXIT_FAILURE);
	}

	if(CONF == NULL){
		log_error(LOGGER, "\nERROR AL LEVANTAR ARCHIVO DE CONFIGURACION\n( Don't PANIC! Si estas por consola ejecuta: ln -s ../%s %s )\n\n"
				, CONF_PATH
				, CONF_PATH);

		exit(EXIT_FAILURE);
	}

//	if(!validarConfig()){ //HACK no lo necesitaba, no entendi el codigo del map y no me servia, anda :P
//		log_error(LOGGER, "No pudo obtenerse alguno de los parametros de configuracion");
//		exit(EXIT_FAILURE);
//	}

	mapa_nodos = dictionary_create();
	lista_jobs = list_create();
	pthread_mutex_init(&mutex_mapa_nodos, NULL);
	pthread_mutex_init(&mutex_lista_jobs, NULL);


	log_info(LOGGER, "intenta conectarse a la ip %s con puerto %d", config_get_string_value(CONF, "IP_FS"), config_get_int_value(CONF, "PUERTO_FS"));
	socketFS = conectarAServidor(config_get_string_value(CONF, "IP_FS"), config_get_int_value(CONF, "PUERTO_FS"));
	while (socketFS == -1) {
		 log_info(LOGGER, "Filesystem no levantado. Se reintenta conexion en unos segundos");
		 sleep(5);
		 socketFS = conectarAServidor(config_get_string_value(CONF, "IP_FS"), config_get_int_value(CONF, "PUERTO_FS"));
	}

	header_t header;
	initHeader(&header);
	header.tipo = MARTA_TO_FS_HANDSHAKE;
	header.largo_mensaje = 0;
	header.cantidad_paquetes = 1;

	log_info(LOGGER, "Conectado a FS! envio header %s", getDescription(header.tipo));
	enviar_header(socketFS, &header);
	t_mensaje mensaje;
	memset(&mensaje, 0, sizeof(t_mensaje));
	recibir_t_mensaje(socketFS, &mensaje);
	log_info(LOGGER, "recibo respuesta %s de FS", getDescription(mensaje.tipo));

	while(mensaje.tipo != ACK){
		log_info(LOGGER, "Todavia el FS no esta disponible. Header recibido: %s. Reintento en 5 segundos", getDescription(header.tipo));
		sleep(5);
		enviar_header(socketFS, &header);
		recibir_t_mensaje(socketFS, &mensaje);
	}

	recibirNodosFS();
	log_info(LOGGER, "%s: FS está operativo. Continúo", getDescription(header.tipo));
}
コード例 #2
0
int main(void) {

	tipoConfigCPU* configuracion = cargarArchivoDeConfiguracionDeCPU("cfgCPU");

	socketCpu = crearSocket();

	conectarAServidor(socketCpu,configuracion->ipMemoria,configuracion->puertoMemoria);

	pid=19;
/*
	ejecutarInstruccion(INICIAR,4,"");
	ejecutarInstruccion(ESCRIBIR,1,"negro");
	ejecutarInstruccion(ESCRIBIR,3,"blanco");
	ejecutarInstruccion(LEER,3,"");*/

	/*ejecutarInstruccion(INICIAR,1,"");
	ejecutarInstruccion(ESCRIBIR,0,"loboNegro");
	ejecutarInstruccion(ESCRIBIR,1,"javiGorro");*/

	ejecutarInstruccion(INICIAR,3,"");
	ejecutarInstruccion(ESCRIBIR,0,"todoOk");
	ejecutarInstruccion(LEER,1,"javiGorro");

	getchar();

	liberarSocket(socketCpu);

	destruirConfigCPU(configuracion);

	return EXIT_SUCCESS;
}
コード例 #3
0
static t_list *convertirMensajeAListaArchivosRemotos(char *mensaje)
{
	t_list *archivosRemotos = list_create();
	char **datosArchivosRemotos = string_split(mensaje, SEPARADOR_ARCHIVOS);

	int i;
	for (i = 0; datosArchivosRemotos[i] != NULL; i ++)
	{
		char **datosArchivo = string_split(datosArchivosRemotos[i], SEPARADOR_CAMPOS_ARCHIVO);
		Archivo *archivoAReducir;

		if (esMiIpYPuerto(datosArchivo[0], datosArchivo[1]))
		{
			char *pathArchivo = obtenerPathDeArchivoEnEspacioTemporal(datosArchivo[2]);
			archivoAReducir = (Archivo *) newArchivoLocal(pathArchivo, LECTURA);
			free(pathArchivo);
		}
		else
		{
			SocketConecta *conexion = newSocketConecta(datosArchivo[0], datosArchivo[1]);
			conectarAServidor(conexion);
			archivoAReducir = (Archivo*) newArchivoRemoto(datosArchivo[2], conexion);
		}

		list_add(archivosRemotos, archivoAReducir);
		free(datosArchivo);
	}

	free(datosArchivosRemotos);
	return archivosRemotos;
}
コード例 #4
0
void *enviarMapperYObtenerResultado(void *arghiloM)
{

	t_hiloMapper *hiloM = arghiloM;
	logOperacion("Comienza hilo mapper, ID_TAREA: %d...",hiloM->idMap);

	SocketConecta *conectarANodo = newSocketConecta(hiloM->ipNodo,hiloM->puertoNodo);

	conectarAServidor(conectarANodo);
	if(!estaConectado(conectarANodo))
	{
		//Le aviso a marta que la rutina fallo porque se desconecto el nodo
		pthread_mutex_lock(&semaforoMarta);
		int dos=2;
		enviarMensaje(hiloM->conectarAMarta,&dos,sizeof(int));
		enviarMensaje(hiloM->conectarAMarta,&hiloM->idMap,sizeof(int));
		pthread_mutex_unlock(&semaforoMarta);
		logCabeceraEnvia("Fallo map, se desconecto el nodo");
		mostrarFinalizacion(2,hiloM->idMap);
		pthread_exit(0);
	}

	if(!estaConectado(hiloM->conectarAMarta))
	{
		logOperacion("Finalizo el hilo mapper (ID_TAREA: %d) porque se desconecto marta", hiloM->idMap);
		//El hilo se finaliza a si mismo
		pthread_exit(0);
	}else
	{
		//Aviso al nodo que soy un job
		char soyJob = 'J';
		enviarMensaje(conectarANodo,&soyJob,1);
		logCabeceraEnvia("Soy job");

		//Mando el contenido de la rutina al Nodo
		enviarArchivoANodo(conectarANodo,hiloM->mapper);

		//Le aviso que es un map y le mando el bloque
		int tamanioMap = 4;
		enviarMensaje(conectarANodo,&tamanioMap, sizeof(int));
		enviarMensaje(conectarANodo,"map",tamanioMap);
		logCabeceraEnvia("Hacer un map");
		enviarMensaje(conectarANodo,&(hiloM->bloque),sizeof(int));
		logCabeceraEnvia("Bloque del nodo");

		//Envio al nodo donde se guarda el resultado del map
		int tamanio = strlen(hiloM->resulMap);
		enviarMensaje(conectarANodo,&tamanio,sizeof(int));
		enviarMensaje(conectarANodo,hiloM->resulMap,tamanio);
		logCabeceraEnvia("Nombre de archivo de resultado");

		//Recibo el resultado de la operacion
		int resultado=0;

		/*0:Salio bien
		 *1:salio mal, fallo la rutina
		 *2:se desconecto el nodo, lo mando al principio
		 */
		recibirYChequearConexionNodo(conectarANodo,&resultado,sizeof(int),hiloM->conectarAMarta,hiloM->idMap);
		logCabeceraRecibe("Resultado de map");


		//Envio el resultado a Marta (Si se desconecto el nodo tambien mando mensaje aparte)
		pthread_mutex_lock(&semaforoMarta);
		enviarMensaje(hiloM->conectarAMarta,&resultado,sizeof(int));
		logCabeceraEnvia("Resultado de map");
		enviarMensaje(hiloM->conectarAMarta,&hiloM->idMap,sizeof(int));
		logCabeceraEnvia("Id de map");
		pthread_mutex_unlock(&semaforoMarta);

		mostrarFinalizacion(resultado,hiloM->idMap);

		//Borro el socket y el semaforo del nodo
		deleteSocketConecta(conectarANodo);

		//Libero la estructura del hilo
		liberarEstructuraHiloMap(hiloM);
	}
	return 0;
}
コード例 #5
0
int main(void) {

//////////////////////////INICIALIZACION DE VARIABLES////////////////////////////////

	tipoConfigMemoria* configuracion = cargarArchivoDeConfiguracionDeMemoria("cfgMemoria");

	int socketParaCpus = crearSocket();

	int socketParaSwap = crearSocket();

	int socketCpuEntrante;

	bool memoriaActiva = true;

//--------------ACA EMPIEZA FERNILANDIA--------------------------
	//t_list* listaRAM = list_create();
	//t_list* listaTLB = list_create();
	//t_list* listaAdministracionPaginas = list_create();

	fd_set listaPrincipal;
	fd_set listaFiltrada;

	FD_ZERO(&listaPrincipal);
	FD_ZERO(&listaFiltrada);
	FD_SET(socketParaCpus,&listaPrincipal);

	tipoEstructuraMemoria* datosMemoria = malloc(sizeof(tipoEstructuraMemoria));

	//datosMemoria->listaRAM = listaRAM;

	//datosMemoria->listaTLB = listaTLB;

	datosMemoria->socketSWAP = socketParaSwap;

	datosMemoria->maximoSocket = socketParaCpus;

	datosMemoria->configuracion = configuracion;

	datosMemoria->cpusATratar = &listaFiltrada;

	//datosMemoria->administradorPaginas = listaAdministracionPaginas;

	datosMemoria->memoriaActiva = &memoriaActiva;

	datosMemoria->socketCpus = socketParaCpus;

	setearEstructuraMemoria(datosMemoria);

//-------------END OF FERNILANDIA-----------------------------------

	asociarAPuerto(socketParaCpus,configuracion->puertoDeEscucha);

	conectarAServidor(socketParaSwap,configuracion->ipSWAP,configuracion->puertoSWAP);

	escucharConexiones(socketParaCpus,maxConexionesEntrantes);

	pthread_t hiloSignals;

	crearThread(&hiloSignals,funcionPrueba,datosMemoria);


/////////////////////////////////////////////////////////////////////////////////////


	while(memoriaActiva){

		FD_ZERO(&listaFiltrada);

		listaFiltrada = listaPrincipal;

		select(datosMemoria->maximoSocket+1,&listaFiltrada,NULL,NULL,NULL);

		if(FD_ISSET(socketParaCpus,&listaFiltrada)){
			socketCpuEntrante = crearSocketParaAceptarSolicitudes(socketParaCpus);
			FD_SET(socketParaCpus,&listaPrincipal);
			FD_SET(socketCpuEntrante,&listaFiltrada);
			datosMemoria->maximoSocket = maximoEntre(datosMemoria->maximoSocket,socketCpuEntrante);
		}

		tratarPeticiones(&datosMemoria);

	}

	destruirConfigMemoria(configuracion);

	return EXIT_SUCCESS;
}
コード例 #6
0
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;
}
コード例 #7
0
void mapSobreBloqueDeDatosYReduceSobreArchivosLocalesYRemotos(int argc, char *argv[])
{
	if (argc < 2)
	{
		fprintf(stderr, "Warning: tenes que indicar si es cliente o servidor para probar el protocolo\n");
		return;
	}


	if (strcmp(argv[1], "servidor") == 0)
	{
		Archivo *archivoLocal = (Archivo*) newArchivoLocal(PATH_ARCHIVO, ESCRITURA);
		long i = 0;
		for (i = 1; i <= 100000; i ++)
		{
			char registro[100];
			sprintf(registro, "1\n");
			escribirRegistro(archivoLocal, registro);
		}
		cerrarArchivo(archivoLocal);

		escucharConexionesANodo(PUERTO, NULL);
	}
	else
	{
		char *ipServer;
		if (argc == 3)
			ipServer = strdup(argv[2]);
		else
			ipServer = strdup("127.0.0.1");


		ejecutar3RutinasDeMap();


		/*
		 * Ejecutar reduce sobre los resultados de map
		 */
		printf("Ejecutando reduce sobre la salida de los maps anteriores y 1 de red!\n");
		Archivo *entrada1Reduce = (Archivo*) newArchivoLocal("/tmp/salidaMapBloque1", LECTURA);
		Archivo *entrada2Reduce = (Archivo*) newArchivoLocal("/tmp/salidaMapBloque4", LECTURA);
		Archivo *entrada3Reduce = (Archivo*) newArchivoLocal("/tmp/salidaMapBloque8", LECTURA);

		SocketConecta *conexion = newSocketConecta(ipServer, PUERTO);
		conectarAServidor(conexion);
		Archivo *archivoRemoto = (Archivo*) newArchivoRemoto(NOMBRE_ARCHIVO, conexion);

		t_list *listaDeArchivosAReducir = list_create();
		list_add(listaDeArchivosAReducir, entrada1Reduce);
		list_add(listaDeArchivosAReducir, entrada2Reduce);
		list_add(listaDeArchivosAReducir, entrada3Reduce);
		list_add(listaDeArchivosAReducir, archivoRemoto);

		Archivo *salidaReduce = (Archivo*) newArchivoLocal("/tmp/salidaReduce", ESCRITURA);

		int resultadoRutina = ejecutarRutinaDeReduce(RUTINA_REDUCE, listaDeArchivosAReducir, salidaReduce);
		if (resultadoRutina == RUTINA_OK)
			printf("La rutina de reduce termino OK\n");
		else if (resultadoRutina == RUTINA_ERROR_EJECUCION)
			printf("La rutina de reduce termino con errores: Error de ejecucion\n");
		else if(resultadoRutina == RUTINA_ERROR_LECTURA_DATOS)
			printf("La rutina de reduce termino con errores: Error de lectura de datos\n");

		cerrarArchivo(entrada1Reduce);
		cerrarArchivo(entrada2Reduce);
		cerrarArchivo(entrada3Reduce);
		cerrarArchivo(archivoRemoto);
		cerrarArchivo(salidaReduce);
	}
}
コード例 #8
0
int main(int argc, char *argv[]) {

	if(argc!=2)//Validar que reciba archivo de configuracion por parametro
	{
		fprintf(stderr,"ERROR: el job debe recibir por parametro el path del archivo de configuracion \n");
		exit(1);
	}
	pthread_mutex_init(&semaforoMarta,NULL);

	Job *job = levantarArchivoConfiguracion(argv[1]);
	iniciarYEstablecerRutaArchivoLog(job->path_log);

	logDebug("Comenzando el job...");

	//Conectarse a marta
	SocketConecta *conectarAMarta = newSocketConecta(job->ip_marta, job->puerto_marta);
	conectarAServidor(conectarAMarta);
	if(estaConectado(conectarAMarta))
	{
		//Muestro por pantalla la conexion a marta
		logConexionMarta("Se ha conectado correctamente a Marta con IP: %s y PUERTO: %s \n",job->ip_marta, job->puerto_marta);
	}else {logDebug("No se pudo conectar a Marta");exit(1);}

	enviarMensaje(conectarAMarta,job->combiner,2);/*envio si soporto combiner(string) si o no*/
	logCabeceraEnvia("Soporte de combiner");

	//Envio archivos
	int i=0;
	while(job->archivos[i]!=NULL)
	{
		//Envio la longitud del string del archivo
		int tamanio = strlen(job->archivos[i]);
		enviarMensaje(conectarAMarta,&tamanio,sizeof(int));
		logCabeceraEnvia("Longitud de path de archivo");

		//Envio el archivo actual
		enviarMensaje(conectarAMarta,job->archivos[i],strlen(job->archivos[i]));
		logCabeceraEnvia("Envio de archivo");
		i++;
	}
	//Aviso a marta que termine de mandar los archivos
	int finArch =12;
	enviarMensaje(conectarAMarta,&finArch,sizeof(int));
	enviarMensaje(conectarAMarta,"Fin archivos",12);
	logCabeceraEnvia("Finalizacion de envio de archivos");

	//Recibo un 0 si no termina, recibo 1 cuando es el fin del job (YA NO ES ASI)
	//int fin = 0;
	int cantidadHilos=0;
	t_list *listaHilos = list_create();

	while(1)
	{
		char *rutina=malloc(4);
		//Recibo que rutina se va a ejecutar (map o red) con '\0' al final, si recibo "fin" termino el job
		recibirYChequearConexion(conectarAMarta,rutina,4);
		logCabeceraRecibe("Rutina a ejecutar");

		// SOLO ACA PUEDE TERMINAR EL JOB, RECIBO UNA RUTINA A EJECUTAR QUE SEA "fin"
		if(strcmp(rutina,"fin")==0)
		{
			free(rutina);
			finalizarJob(cantidadHilos,listaHilos,conectarAMarta,job,i);
			return EXIT_SUCCESS;
		}

		//Recibo ip del nodo al que le comunico
		int tamIp=0;
		recibirYChequearConexion(conectarAMarta,&tamIp,sizeof(int));
		char *ipNodo=malloc(tamIp);
		recibirYChequearConexion(conectarAMarta,ipNodo,tamIp);
		logCabeceraRecibe("Ip del nodo");

		//Recibo puerto del nodo
		int tamPuerto=0;
		recibirYChequearConexion(conectarAMarta,&tamPuerto,sizeof(int));
		char *puertoNodo=malloc(tamPuerto);
		recibirYChequearConexion(conectarAMarta,puertoNodo,tamPuerto);
		logCabeceraRecibe("Puerto del nodo");

		//Recibo donde se guarda el resultado de la operacion en espacio temporal
		int tamResul = 0;
		recibirYChequearConexion(conectarAMarta,&tamResul,sizeof(int));
		char *resulOperacion=malloc(tamResul);
		recibirYChequearConexion(conectarAMarta,resulOperacion,tamResul);
		logCabeceraRecibe("Archivo de resultado de la operacion");
			//Segun que rutina sea creo un hilo para enviar la rutina al nodo
			if(strcmp(rutina,"map")==0)
			{
				free(rutina);

				//Recibo bloque e id de la operacion
				int bloque = 0;
				int idMap = 0;
				recibirYChequearConexion(conectarAMarta,&bloque,sizeof(int));
				logCabeceraRecibe("Bloque del nodo");
				recibirYChequearConexion(conectarAMarta,&idMap,sizeof(int));
				logCabeceraRecibe("Id de operacion map");

				//Cargo la estructura hiloM
				t_hiloMapper *hiloM= malloc(sizeof(t_hiloMapper));
				hiloM->ipNodo=strdup(ipNodo);
				hiloM->puertoNodo=strdup(puertoNodo);
				hiloM->mapper=strdup(job->mapper);
				hiloM->conectarAMarta=conectarAMarta;
				hiloM->bloque=bloque;
				hiloM->resulMap=strdup(resulOperacion);
				hiloM->idMap=idMap;
				pthread_t hiloMapper;
				pthread_create(&hiloMapper,NULL,enviarMapperYObtenerResultado,hiloM);
				list_add(listaHilos,&hiloMapper);
				cantidadHilos++;

				free(resulOperacion);

				//Muestro que se creo un hilo
				logCreacionHiloMapper("Se creo un hilo mapper con parametros: Ip_Nodo: %s, Puerto_Nodo: %s, Rutina de map: %s",ipNodo,puertoNodo,job->mapper);

			}else if(strcmp(rutina,"red")==0)
			{
				free(rutina);
				//Recibo los archivos y nodos en los que se ejecuta el reduce
//				int tamArchivosYNodos=0;
//				recibirYChequearConexion(conectarAMarta,&tamArchivosYNodos,sizeof(int));
//				char *archivosYNodos=malloc(tamArchivosYNodos);
//				recibirYChequearConexion(conectarAMarta,archivosYNodos,tamArchivosYNodos);
				char *archivosYNodos;
				recibirTodo(conectarAMarta, (void**)&archivosYNodos);
				logCabeceraRecibe("Archivos y nodos");
				int idReduce=0;
				recibirYChequearConexion(conectarAMarta,&idReduce,sizeof(int));
				logCabeceraRecibe("Id de operacion reduce");

				//Cargo la estructura hiloR
				t_hiloReducer *hiloR= malloc(sizeof(t_hiloReducer));

				//Recibo si soy el ultimo reduce o no (Si: 1, No: 0)
				int soyUltimo = 0;
				recibirYChequearConexion(conectarAMarta,&soyUltimo,sizeof(int));
				//Si soy el ultimo cargo en la estructura del hilo el path del resultado en FS
				if(soyUltimo)
				{
					hiloR->resultado=strdup(job->resultado);
				}
				hiloR->soyUltimo = soyUltimo;
				hiloR->ipNodo=strdup(ipNodo);
				hiloR->puertoNodo=strdup(puertoNodo);
				hiloR->reducer=strdup(job->reduce);
				hiloR->conectarAMarta=conectarAMarta;
				hiloR->archivosYNodos=strdup(archivosYNodos);
				hiloR->idReduce=idReduce;
				hiloR->resulReduce=strdup(resulOperacion);

				pthread_t hiloReducer;
				pthread_create(&hiloReducer,NULL,enviarReducerYObtenerResultado,hiloR);
				list_add(listaHilos,&hiloReducer);
				cantidadHilos++;

				free(archivosYNodos);
				free(resulOperacion);

				//Muestro que se creo un hilo
				logCreacionHiloReducer("Se creo un hilo reducer con parametros: Ip_Nodo: %s, Puerto_Nodo: %s, Rutina de reduce: %s, Archivo de resultado: %s",ipNodo,puertoNodo,job->reduce,job->resultado);
			}
			//recibirYChequearConexion(conectarAMarta,&fin,sizeof(int));
			//logCabeceraRecibe("Termino el job?");
			//Libero ip y puerto del nodo
			free(ipNodo);
			free(puertoNodo);
	}
	return EXIT_SUCCESS;
}
コード例 #9
0
void transferirRegistrosRemotos(int argc, char *argv[])
{
	/*
	 * PAra ejecutar las pruebas:
	 * ./NodoTest servidor
	 *
	 * ./NodoTest cliente
	 */

	if (argc < 2)
	{
		fprintf(stderr, "Warning: tenes que indicar si es cliente o servidor para probar el protocolo\n");
		return;
	}


	if (strcmp(argv[1], "servidor") == 0)
	{
		Archivo *archivoLocal = (Archivo*) newArchivoLocal(PATH_ARCHIVO, ESCRITURA);
		int i = 0;
		for (i = 0; i <= 100000; i ++)
		{
			char registro[100];
			sprintf(registro, "REGISTRO %d\n", i);
			escribirRegistro(archivoLocal, registro);
		}
		cerrarArchivo(archivoLocal);

		escucharConexionesANodo("12345", NULL);
	}
	else
	{
		char *ipServer;
		if (argc == 3)
			ipServer = strdup(argv[2]);
		else
			ipServer = strdup("127.0.0.1");

		SocketConecta *conexion = newSocketConecta(ipServer, "12345");
		conectarAServidor(conexion);

		Archivo *archivoRemoto = (Archivo*) newArchivoRemoto(NOMBRE_ARCHIVO, conexion);

		char *registro = obtenerRegistro(archivoRemoto);

		while (registro != NULL && ! huboError(registro))
		{
			printf("Registro recibido: %s", registro);

			free(registro);
			registro = obtenerRegistro(archivoRemoto);
		}

		if (registro == NULL)
		{
			printf("Recibi el ultimo regisro\n");
			cerrarArchivo(archivoRemoto);
		}
		else
			printf("Se desconecto el server");

		cerrarSocketConecta(conexion);
		printf("Cerre la conexion\n"); fflush(stdout);
	}
}