Practica Rpc

14
Instituto Tecnológico Superior De Los Ríos. MATERIA: SISTEMAS DISTRIBUIDOS ALUMNOS: Karina Rodríguez Arias Zuleyma Yajaira Pérez Landero Ricardo Cruz Zurita. Agustín Cañas Landeros. “Ingeniería En Sistemas Computacionales” TRABAJO: Reporte -RPC CATEDRATICO: Edna Mariel Mil Chontal 8vo Semestre Grupo: Matutino Balancan, Tabasco julio del 2015

description

programacion rpc

Transcript of Practica Rpc

  • Instituto Tecnolgico Superior

    De Los Ros.

    MATERIA:

    SISTEMAS DISTRIBUIDOS ALUMNOS:

    Karina Rodrguez Arias

    Zuleyma Yajaira Prez Landero

    Ricardo Cruz Zurita.

    Agustn Caas Landeros.

    Ingeniera En Sistemas Computacionales TRABAJO:

    Reporte -RPC CATEDRATICO:

    Edna Mariel Mil Chontal 8vo Semestre Grupo: Matutino

    Balancan, Tabasco julio del 2015

  • Introduccin

    Introduciendo el presente trabajo de RPC sobre las conexiones remotas, en el

    contenido de esta prctica podemos encontrar un cliente y un servidor del cual

    mandaremos a llamar desde consola para aadir y borrar un dato en este caso

    siendo un nombre y est a su vez siendo guardado en un archivo de .dat.

    Una llamada a un procedimiento (funcin o subrutina) es un mtodo bien conocido

    para transferir el control de una parte del programa a otra, con un retorno del control

    a la primera.

  • Programa RPC en C El siguiente programa consta de 5 archivos para que funcione, el primero dir.x donde llama a funciones de los otros programas, el segundo es dirServer.c este es el servidor donde se realizan las funciones donde se guardan los datos en un archivo, el tercer dirCliente.c este es donde se establece un men para elegir las opciones de las funciones que realiza nuestro programa y hace la peticin al servidor, el cuarto es un archivo.dat donde se guarda los datos y eliminan y el ultimo es el archivo que genera los dems archivos para la ejecucin de los programas. Lo que en general realiza el programa es buscar datos en un directorio.dat y la parte que nos quedo como tarea a nosotros fue agregar las opciones agregar un nuevo registro e iliminar dichos registros. En el cdigo cliente agregamos las opciones 4 y 5 del men para agregar y borrar los registros al archivo. case INGRESAR_DATOS: registro = ingresar_datos_2(&argv[3],cl); if (*registro==0){ printf("Error al cargar los datos\n"); } else{ printf("Datos guardados con exito\n"); } break; case Borrar_Datos: borrar = borrar_datos_2(&argv[2],cl); if(*borrar==0){ printf("Error al borrar datos"); } else { printf("\nDatos borrados con exito\n"); } break;

    Funcin agregar en el servidor:

    En la parte del servidor agregamos la funcin donde se agregaran los registros en el archivo, lo que hace es abrir el archivo y guardar el registro agregando al final de los registros. int *ingresar_datos_2_svc(char **ingresar, struct svc_req *rqstp){ if(!(fp=fopen(DATABASE, "a+"))) { printf("Error al abrir DATABASE: %s\n",DATABASE);

  • return((int *)NULL); } fprintf(fp,"%s\n",*ingresar); int a=1; fclose(fp); return(&a);

    Y en el cdigo dir.x solo se agrega la parte donde invoca a funcin de ingresar Datos, dndole la opcin nmero 4. int INGRESAR_DATOS(string)=4;

    Funcin eliminar en el servidor: int *borrar_datos_2_svc(char **borrar, struct svc_req *rqstp){ int banderilla=0; int cont=2; char linea[100]; archivor=fopen("archivotemp.txt", "w"); archivo2=fopen("directorio.dat", "r"); fp=fopen("directorio.dat","r"); if(fp == NULL){ printf(" \n error al eliminado"); } else{ while(feof(archivo2) == 0){ fgets(linea,100,archivo2); banderilla++; } while(feof(fp) == 0){ fgets(linea,100,fp); if(banderilla > cont){ fprintf(archivor, "%s", linea); }else { printf(" \nDato eliminado %s", linea); } cont++; } } int x=1; remove("directorio.dat"); rename("archivotemp.txt", "directorio.dat");

  • fclose(fp); fclose(archivo2); fclose(archivor); return(&x); }

    Y en el cdigo dir.x solo se agrega la parte donde invoca a funcin de borrar datos dndole la opcin nmero 5. int Borrar_Datos(string)=5; CODIGOS:

    dir.x /* Directivas al Preprocesador: Pasan Directamente */ %#define DATABASE "directorio.dat" /* Definicion de constantes */ const MAX_STR=255; /* Definicion de Estructuras */ struct direct { string nombre ; /* Longitud variable */ string apPaterno ; /* char *apPaterno */ string apMaterno ; int extension; string mensaje ; }; struct nReg{ struct direct regs; bool hayMas; }; typedef opaque arrDatos; /* Definicion del Programa */ program DIRPROG{ version DIRVERS{ direct BUSQ_NOMBRE(string)=1; /* No. de la funcion */ nReg BUSQ_VARIOS(int)=2; arrDatos DAME_CADENA(int)=3; int INGRESAR_DATOS(string)=4; int Borrar_Datos(string)=5; }=2; /* Numero de version de la interfase. Puede haber varias en un mismo prog. */ }=0x2000001; /* Numero de Programa */

  • dirServer.c // Envia comandos al servidor para trabajar con archivos #include #include #include #include #include #include #include #include #include #include // RPCs #include "dir.h" // estructura de los mensajes FILE *fp=NULL; FILE *archivo2=NULL; FILE *archivor=NULL; char registro[MAX_STR]; char nombre[MAX_STR], apPaterno[MAX_STR], apMaterno[MAX_STR], mensaje[MAX_STR]; static direct pR={nombre,apPaterno,apMaterno,0,mensaje}; static nReg nRegs; direct noEsta={"noEsta","noEsta","noEsta",0,"sinComentarios"}; direct arrDirect[3]= {{"Victor","Sosa","Sosa",143,"Hola1"}, {"Juan","Perez","Serna",147,"Hola2"}, {"Javier","Ortiz","hdz",156,"Hola3"} }; char cadena[]= "Aracely Arroyo R 3604 Hola1 Pedro Perez G 4221 Hola2"; int leeDirectorio(){ char buf[MAX_STR]; if(!fgets(buf,MAX_STR - 1,fp)) return(0);

  • sscanf(buf,"%s%s%s%d%s",pR.nombre,pR.apPaterno,pR.apMaterno,&pR.extension,pR.mensaje); return 1; } direct *busq_nombre_2_svc(char **nombreBuscado, struct svc_req *rqstp){ printf("SERVIDOR: Nombre Buscado: %s\n", *nombreBuscado); if(!(fp=fopen(DATABASE, "r"))) { printf("Error al abrir el archivo: %s\n",DATABASE); return((direct *)NULL); } while (leeDirectorio()) if(!strcmp(pR.nombre, *nombreBuscado)) break; if (feof(fp)) { printf("SERVIDOR: No Encontre el Registro\n"); fclose(fp); return(&noEsta); } fclose(fp); return(&pR); } arrDatos *dame_cadena_2_svc(int *nb, struct svc_req *rqstp){ static arrDatos misDatos; printf("SERVIDOR: Me Piden %d Registros\n", *nb); misDatos.arrDatos_len= strlen(cadena); misDatos.arrDatos_val= cadena; return(&misDatos); } nReg *busq_varios_2_svc(int *nbReg, struct svc_req *rqstp){ printf("SERVIDOR: Me Piden %d Registros\n",*nbReg); nRegs.regs.regs_len=3; nRegs.regs.regs_val=arrDirect; nRegs.hayMas=TRUE; return (&nRegs); } int *ingresar_datos_2_svc(char **ingresar, struct svc_req *rqstp){ if(!(fp=fopen(DATABASE, "a+"))) { printf("Error al abrir DATABASE: %s\n",DATABASE); return((int *)NULL); } fprintf(fp,"%s\n",*ingresar);

  • int a=1; fclose(fp); return(&a); printf("Dato guardado"); } int *borrar_datos_2_svc(char **borrar, struct svc_req *rqstp){ int banderilla=0; int cont=2; char linea[100]; archivor=fopen("archivotemp.txt", "w"); archivo2=fopen("directorio.dat", "r"); fp=fopen("directorio.dat","r"); if(fp == NULL){ printf(" \n error al eliminado"); } else{ while(feof(archivo2) == 0){ fgets(linea,100,archivo2); banderilla++; } while(feof(fp) == 0){ fgets(linea,100,fp); if(banderilla > cont){ fprintf(archivor, "%s", linea); }else { printf(" \nDato eliminado %s", linea); } cont++; } } int x=1; remove("directorio.dat"); rename("archivotemp.txt", "directorio.dat"); fclose(fp); fclose(archivo2); fclose(archivor); return(&x); }

  • dirCliente.c // Envia comandos al servidor para trabajar con archivos #include #include #include #include #include #include #include #include #include #include // RPCs #include "dir.h" // estructura de los mensajes direct *pR; nReg *pNreg; arrDatos *misDatos; int i, cuantos=3; int *registro; int *borrar; main(int argc,char *argv[]){ CLIENT *cl; /* un handle del cliente */ char *valor; int key=0; if(argc>=3) key=atol(argv[2]); if((key==1 && argc!=4) || ((key==2 || key==3) && argc!=3) || key
  • if (!(cl=clnt_create(argv[1], DIRPROG, DIRVERS, "tcp"))){ clnt_pcreateerror(argv[1]); exit(1); } switch (key = atol(argv[2])) { case BUSQ_NOMBRE: pR = busq_nombre_2(&argv[3],cl); printf("CLIENTE\nNombre\tapPaterno\tapMaterno\tExtensin\tMensaje\n"); printf("%s\t %s\t\t %s\t\t %d\t\t %s\n", pR->nombre,pR->apPaterno,pR->apMaterno,pR->extension,pR->mensaje); break; case DAME_CADENA: cuantos=2; misDatos= dame_cadena_2(&cuantos,cl); printf("Caracteres Recibidos= %d\n",misDatos->arrDatos_len); for (i=0; i < misDatos->arrDatos_len; i++) printf("%c", misDatos->arrDatos_val[i]); printf("\n"); break; case BUSQ_VARIOS: cuantos=3; pNreg= busq_varios_2(&cuantos,cl); if(pNreg==NULL) break; printf("CLIENTE\nNombre\tapPaterno\tapMaterno\tExtensin\tMensaje\n"); for(i=0, pR=pNreg->regs.regs_val; iregs.regs_len; i++, pR= pNreg->regs.regs_val+i) printf("%s\t %s\t\t %s\t\t %d\t\t %s\n", pR->nombre,pR->apPaterno,pR->apMaterno,pR->extension,pR->mensaje); printf(" %s MAS DATOS\n", pNreg->hayMas?"HAY":"NO HAY"); break; case INGRESAR_DATOS: registro = ingresar_datos_2(&argv[3],cl); if (*registro==0){ printf("Error al cargar los datos\n"); } else{ printf("Datos guardados con exito\n"); } break; case Borrar_Datos: borrar = borrar_datos_2(&argv[2],cl); if(*borrar==0){ printf("Error al borrar datos");

  • } else { printf("\nDatos borrados con exito\n"); } break; default: printf("CLIENTE: %s: Servicio Desconocido\n",argv[0]); } }

    Proceso: 1.- Primero extraemos los archivos con el comando make en la terminal.

  • 2.- Usando la misma terminal accedemos como superusuario y ejecutamos el archivo server.

    3.- Abrimos una nueva terminal y corremos el archivo cliente e ingresamos nuestro dato.

    4.- A continuacin tenemos en la siguiente imagen donde nos indica el ltimo dato ha sido agregado.

    Dato agregado.

  • 6.-A continuacin en la siguiente imagen se muestra la opcion 5 que tenemos dentro del men que se encarga de eliminar un dato. 7.- Tenemos en la siguiente imagen que el ltimo dato ingresado ahora, bien ha sido Borrado el cual haca referencia Zuleyma Perez Landero 55 ISC.

    Dato borrado.

  • Conclusin Concluyendo el siguiente trabajo prctico comprendimos de la forma en que funciona RPC, ya que se comprendi el proceso que se tienen de cmo agregar un dato desde el directorio y siendo a la vez eliminado dicho dato. Haciendo conexiones remotas utilizando el sistema operativo Linux, partiendo de un cliente, un servidor y un dir.x.