Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso de Redes I CI-4815 Trimestre Septiembre Diciembre 2013

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso de Redes I CI-4815 Trimestre Septiembre Diciembre 2013"

Transcripción

1 Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso de Redes I CI-4815 Trimestre Septiembre Diciembre 2013 Proyecto I Autores: Lairon Acosta. Carnet: Jueves 28 de Noviembre de 2013

2

3 Explicación del Diagrama de Secuencia 1. El programa cchat1 envia comando men Hola al servidor, este lo recibe y lo envia a todos los usuarios conectados a las mismas salas de chat que cchat1, en este caso a cchat2 que recibe el mensaje. 2. El programa cchat1 envia comando usu al servidor, este lo recibe y procesa la petición, busca todos los usuarios conectados y le envia respuesta al programa cchat1. 3. El programa cchat1 envia comando sal al servidor, este lo recibe y procesa la petición, busca todas las salas disponibles y le envia respuesta al programa cchat1. 4. El programa cchat1 envia comando crea nueva al servidor, este lo recibe y procesa la petición, crea una sala de nombre 'nueva' y le envia respuesta al programa cchat1 de sala creada exitosamente. 5. El programa cchat1 envia comando des al servidor, este lo recibe y procesa la petición, dessuscribe al cliente cchat1 de todas las salas a la que esta conectado y le envia respuesta al programa cchat1 de operación exitosa. 6. El programa cchat1 envia comando sus nueva al servidor, este lo recibe y procesa la petición, suscribe al cliente cchat1 a la sala de nombre 'nueva' y le envia respuesta al programa cchat1 de suscricción exitosa. 7. El programa cchat1 envia comando men chao al servidor, este lo recibe y lo envia a todos los usuarios conectados a las mismas salas de chat que cchat1, en este caso a cchat2 que recibe el mensaje. 1- Verificación de comandos: Explicación de los Aspectos del Proyecto Para la verificación de los comandos se utilizó Expresiones Regulares. Estas permitieron verificar tanto patrones de comando como tipo de cada parámetro de forma más fácil. Por lo tanto, las expresiones regulares usadas para cada comando válido se muestran a continuación: expmensaje[] = " *men *[a-za-z0-9.,-?'!\"#$%&/()@+-/*\\][a-za-z *$"; expcrearsala[] = " *cre *[a-za-z0-9][a-za-z0-9]* *$"; expsuscribesala[] = " *sus *[a-za-z0-9][a-za-z0-9]* *$"; expeliminasala[] = " *eli *[a-za-z0-9][a-za-z0-9]* *$"; expsalas[] = " *sal *$";

4 expusuarios[] = " *usu *$"; expdessuscribir[] = " *des *$"; expfuerachat[] = " *fue *$"; 2- Estructuras de datos: Se crearon especificamente dos estructuras de datos, la primera para almacenar la información de cada usuario conectado al servidor y la segunda para administrar las salas disponibles del servidor. Primera estructura: Id socket de usuario Nombre de usuario Estado de usuario: Conectado Desconectado Salas de usuario Segunda estructura: Nombre de sala Estado de sala: Activa Desactiva 3- Cliente/Servidor multihilo: Se usó la nocion de Cliente/Servidor multihilo. De tal manera, para cada cliente se crearon dos hilos, uno para que recibiera las respuestas del servidor y otro para enviar peticiones al servidor. De la misma forma, para el servidor se creó un hilo por cada cliente aceptado para recibir peticiones, este hilo ejecuta una funcion para gestionar las distintas peticiones de los clientes. 4- Funciones de los comandos(diseño del programador): Comando 'men (texto)': este comando envia el (texto) a todos los usuarios conectados a la misma sala del enviador. No se envia el (texto) así mismo por cuestiones de acuerdos, debido a que en el enunciado no tiene ésta restricción explícita. Comando 'sus (Sala)': este comando suscribe al usuario que lo invoca a una sala que este disponible, es decir, que este creada. Si la sala no existe le envía un aviso al usuario. Comando 'cre (Sala)': este comando hace que el usuario que lo invoca cree una sala que no haya sido creada y simultaneamente lo suscribe a ella. Si la sala ya fué creada le envía un aviso al usuario. Comando 'eli (Sala)': este comando hace que el usuario que lo invoca elimine una sala

5 cualquiera que este creada. Simultaneamente, des-sucribe a todos los usuarios que esten suscritos a ella y les envía un mensaje informando que la sala ha sido eliminada. Si la sala no existe le envía un aviso al usuario. Comando 'sal ': Este comando le muestra por pantalla al usuario que lo invoca una lista de las salas disponibles del servidor. Comando 'usu ': Este comando le muestra por pantalla al usuario que lo invoca una lista de los usuarios suscritos al servidor, incluyéndolo a él mismo. Comando 'fue ': Este comando le permite al usuario que lo invoca terminar el programa de introducción de comandos y al mismo tiempo la terminación del programa cchat. Además, le envía un aviso al usuario de que ha terminado su ejecución de comandos y programa cchat. 5- Restricciones de parámetros de las llamadas cchat y schat: Para la llamada del programa schat, tenemos que los parámetros de entrada podran venir en cualquier orden. Destacando que el parámetro de la opcion '-s' puede existir o no. Llamada: schat [-p <puerto>] [-s <sala>] Para la llamada del programa cchat, los parámetros podrán venir en cualquier orden igualmente, pero los parámetros de cada opción son obligatorios. Destacando con esto, que debe existir archivo de entrada obligatoriamente para la opción '-a'. Esto debido acuerdo tomado por el programador. Llamada: cchat [-h <host>] [-p <puerto>] [-n <nombre>][-a <archivo>] 6- Entradas inválidas en llamadas y comportamiento a tomar: Se presentan una serie de entradas inválidas o errores y sus respectivos manejos: Error abriendo socket: El programa termina su ejecución y envía mensaje de error abriendo socket. Error en el puerto: El programa termina su ejecución y envía mensaje de error en el puerto. Error en el host: El programa termina su ejecución y envía mensaje de error en el host. Error realizando 'bind' socket: El programa termina su ejecución y envía mensaje de error en el bind. Error realizando 'listen' socket: El programa termina su ejecución y envía mensaje de error en el listen. Error realizando 'connect' socket: El programa termina su ejecución y envía mensaje de error en el connect.

6 Número inválido de argumentos: El programa termina su ejecución y envía mensaje de error número inválido de argumentos. Error de opción inválida: El programa termina su ejecución y envía mensaje de error de opción no corresponde o no es válida. Error de opción en posición inválida: El programa termina su ejecución y envía mensaje de error de opción en posición inválida. Error en compilar expresión regular(no aparecerá): El programa termina su ejecución y envía mensaje de error de expresión regular no compilada. Error abriendo archivo: El programa termina su ejecución y envía mensaje de error abriendo archivo. Error al crear hilo: El programa termina su ejecución y envía mensaje de error al crear hilo en el cliente o servidor. 7- Estado del proyecto: El proyecto tiene 100% de funcionalidad y está 100% documentado.

7 /* Proyecto 1: Redes ci4815 Programa: Cliente.c Realizado por: Lairon Acosta Version: Includes del sistema #include <stdio.h> #include <string.h> #include <stdlib.h> #include <Cola.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <SocketCliente.h> #include <pthread.h> #include <sys/syscall.h> #include <sys/resource.h> #include <errno.h> #include <sys/stat.h> #include <unistd.h> #include <dirent.h> #include <fcntl.h> #include <sys/time.h> /*funcion: funcion principal que realiza las acciones de un cliente argc: cantidad de argumentos argv: argumentos de la llamada del cliente main ( int argc, char *argv[] ) { //Declaracion de variables Cola cola = NULL; char host[100]; char puerto[100]; char nombre[100]; char archivo[100]; char Cadena[100]; int fd_socket; int rc1, rc2; long id_hilo; pthread_t threads[2]; Parametros *comandos; // Comando de entrada: cchat [-h <host>] [-p <puerto>] [-n <nombre>][-a <archivo>]

8 //si hay 9 argumentos, proceso argumentos if ( argc == 9 ) { /* llamo a funcion que identificara la correspondencia de los argumentos del programa principal procesarargumentoscliente(argc, argv, &cola); strcpy(host, dameprimero(&cola)); //Obtengo host strcpy(puerto, dameprimero(&cola)); //Obtengo puerto strcpy(nombre, dameprimero(&cola)); //Obtengo nombre strcpy(archivo, dameprimero(&cola)); //Obtengo archivo cola=null; //destruccion de la cola free(cola); //sino envio error else { printf ("Programa %s.c: Error: numero invalido de argumentos.\n", argv[0]); exit(-1); // Inicia configuracion de conexion de Sockets //Se abre la conexion con el cliente fd_socket = ConexionInetCliente(host,puerto); /* Allocate memory for pthread_create() arguments comandos = calloc(1,sizeof(struct parametros)); //si hay memoria if (comandos == NULL) { printf("error: no hay memoria para almacenar argumentos"); exit(-1); //almaceno numero de socket y nombre de archivo comandos[0].idsocketusuario = fd_socket; strcpy(comandos[0].texto,archivo); if ( fd_socket == -1) { printf("error DE CONEXION INET\n"); exit(-1); else { //socket para enviar el nombre del usuario send( fd_socket, nombre, strlen(nombre)+1, 0); //crea hilo para enviar mensajes if ( ( rc1 = pthread_create( &threads[0], NULL, enviarmensaje, &comandos[0])) ) {

9 printf("error al crear hilo para recibir mensaje\n"); close(fd_socket); exit(-1); //crea hilo para recibir mensajes if ( ( rc2 = pthread_create( &threads[1], NULL, recibirmensaje, (void *)(intptr_t) fd_socket)) ) { printf("error al crear hilo para enviar mensaje\n"); close(fd_socket); exit(-1); //envio comandos del archivo sino hubo errores de archivo if(!enviarcomandos(fd_socket, archivo)){ printf("error abriendo archivo y no envio comandos del archivo\n"); exit(-1); //espero por los hilos creados pthread_join( threads[0], NULL); pthread_join( threads[1], NULL); //cierro socket close(fd_socket);

10 /* Proyecto 1: Redes ci4815 Programa: SocketCliente.c Realizado por: Lairon Acosta Version: Includes del sistema #include <stdio.h> #include <string.h> #include <stdlib.h> #include <Cola.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/syscall.h> #include <sys/resource.h> #include <errno.h> #include <sys/stat.h> #include <unistd.h> #include <dirent.h> #include <fcntl.h> #include <sys/time.h> #include <regex.h> #include <SocketCliente.h> /*******Implementaciones de metodos******* /*funcion: realiza conexion de sockets con el servidor arg1: direccion ip o nombre de maquina del cliente arg2: puerto donde recibira la conexion return: descriptor de conexion int ConexionInetCliente ( char *host, char *puerto) { //Declaracion de variables int fd_socket; struct sockaddr_in address; struct in_addr inaddr; struct hostent *host_cliente; // Inicia configuracion de conexion de Sockets // Si el argumento se puede convertir en una direccion IP lo hace, de lo contrario busca en DNS if ( inet_aton(host,&inaddr) ) { host_cliente = gethostbyaddr((char *) &inaddr, sizeof(inaddr), AF_INET); //printf("host by ip\n"); else {

11 host_cliente = gethostbyname(host); //printf("host by name\n"); //verifica si se obtuvo error en la obtencion del hostent if (!host_cliente) { printf("error en el host\n"); return -1; // //Llenamos la estructura para TCP/IP address.sin_family = AF_INET; //DIR PROTOCOLO address.sin_addr.s_addr = ((struct in_addr *)(host_cliente->h_addr))->s_addr; //dir HOST //verifica si se obtuvo error en el puerto if (!(address.sin_port = htons(atoi(puerto))) ) { //dir PUERTO printf("error en el puerto\n"); return -1; // //Abrimos el socket if(( fd_socket = socket (PF_INET, SOCK_STREAM, 0)) < 0) { printf("error abriendo el socket\n"); return -1; // //Conectamos el socket if ( (connect(fd_socket, (struct sockaddr *) &address, sizeof(address))) == -1 ) { printf("error en funcion -connect- del socket: \n"); perror("connect"); return -1; // return fd_socket; /*funcion: envia mensajes al servidor arg1: descriptor de conexion void *enviarmensaje ( void * id_hilo ) { char buffer[300]; int id; struct parametros *comandos = (struct parametros *) id_hilo;

12 id = comandos->idsocketusuario; while(1) { fgets(buffer, 300, stdin); send( id, buffer, strlen(buffer)+1, 0); /*funcion: recibe mensajes del servidor arg1: descriptor de conexion void *recibirmensaje ( void *id_hilo ) { char buffer[300]; int id; id = (int)(intptr_t)id_hilo; while(1) { recv( id, buffer, 300, 0); if( strcmp(buffer,"fue")==0){ printf("termino la ejecucion de comandos y el programa cchat satisfactoriamente.\n\n"); exit(-1); printf("%s\n",buffer); fflush(stdout); /*funcion: envia comandos de un archivo al servidor arg1: id de usuario a que pertenece el archivo arg2: nombre del archivo int: 1 si envio comandos exitosamente, 0 sino. int enviarcomandos(int id, char *archivo) { FILE *ficheroentrada; char buffere[200]; int j=0; //abro archivo de entrada ficheroentrada = fopen( archivo, "r" );

13 if (!ficheroentrada) { //IMPRIME ERROR //printf("mensaje: **ERROR ABRIENDO ARCHIVO DE ENTRADA\n"); return 0; else { //Extrae cada palabra del archivo while (feof(ficheroentrada) == 0) { fgets(buffere,200,ficheroentrada); if (feof(ficheroentrada) == 0) { printf("%s",buffere); send( id, buffere, strlen(buffere)+1, 0); strcpy(buffere, ""); sleep(1); fclose(ficheroentrada); return 1; //CIERRA EL archivo de entrada /*funcion: procesa los argumentos de la llamada Cliente arg1: cantidad de argumentos arg2: lista de argumentos arg3: cola que saldra modificada void procesarargumentoscliente(int numeroarg, char *argv[], Cola *cola) { char retorno[5][50]; // Comando de entrada: cchat [-h <host>] [-p <puerto>] [-n <nombre>][-a <archivo>] if( strcmp(argv[1],"-h") == 0 ) { //copia el host en la posicion 0 del arreglo retorno strcpy(retorno[0],argv[2]); if( strcmp(argv[3],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[4]); if( strcmp(argv[5],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno

14 strcpy(retorno[2],argv[6]); if( strcmp(argv[7],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[8]); printf ("Error: argumento -a en pos invalida\n"); else if( strcmp(argv[7],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[8]); if( strcmp(argv[5],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[6]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n no corresponde\n"); else if( strcmp(argv[5],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[6]); if( strcmp(argv[3],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[4]); if( strcmp(argv[7],"-a") == 0 ) {

15 else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[8]); printf ("Error: argumento -a en pos invalida\n"); else if( strcmp(argv[7],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[8]); if( strcmp(argv[3],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[4]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else if( strcmp(argv[7],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[8]); if( strcmp(argv[3],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[4]); if( strcmp(argv[5],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[6]);

16 printf ("Error: argumento -a en pos invalida\n"); else if( strcmp(argv[5],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[6]); if( strcmp(argv[3],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[4]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else { printf ("Error: argumento -p en pos invalida\n"); else if ( strcmp(argv[3],"-h") == 0 ) { //copia el host en la posicion 1 del arreglo retorno strcpy(retorno[0],argv[4]); if( strcmp(argv[1],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[2]); if( strcmp(argv[5],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[6]); if( strcmp(argv[7],"-a") == 0 ) {

17 else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[8]); printf ("Error: argumento -a en pos invalida\n"); else if( strcmp(argv[7],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[8]); if( strcmp(argv[5],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[6]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else if( strcmp(argv[5],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[6]); if( strcmp(argv[1],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[2]); if( strcmp(argv[7],"-a") == 0 ) { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[8]);

18 else { printf ("Error: argumento -a en pos invalida\n"); else if( strcmp(argv[7],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[8]); if( strcmp(argv[1],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[2]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else if( strcmp(argv[7],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[8]); if( strcmp(argv[1],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[2]); if( strcmp(argv[5],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[6]); printf ("Error: argumento -a en pos invalida\n");

19 else if( strcmp(argv[5],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[6]); if( strcmp(argv[1],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[2]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else { printf ("Error: argumento -p en pos invalida\n"); else if ( strcmp(argv[5],"-h") == 0 ) { //copia el host en la posicion 1 del arreglo retorno strcpy(retorno[0],argv[6]); if( strcmp(argv[1],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[2]); if( strcmp(argv[3],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[4]); if( strcmp(argv[7],"-a") == 0 ) { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[8]);

20 else { printf ("Error: argumento -a en pos invalida\n"); else if( strcmp(argv[7],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[8]); if( strcmp(argv[3],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[4]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else if( strcmp(argv[3],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[4]); if( strcmp(argv[1],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[2]); if( strcmp(argv[7],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[8]); printf ("Error: argumento -a en pos invalida\n");

21 else if( strcmp(argv[7],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[8]); if( strcmp(argv[1],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[2]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else if( strcmp(argv[7],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[8]); if( strcmp(argv[1],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[2]); if( strcmp(argv[3],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[4]); printf ("Error: argumento -a en pos invalida\n");

22 else if( strcmp(argv[3],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[4]); if( strcmp(argv[1],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[2]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else { printf ("Error: argumento -p en pos invalida\n"); else if ( strcmp(argv[7],"-h") == 0 ) { //copia el host en la posicion 1 del arreglo retorno strcpy(retorno[0],argv[8]); if( strcmp(argv[1],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[2]); if( strcmp(argv[3],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[4]); if( strcmp(argv[5],"-a") == 0 ) { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[6]);

23 else { printf ("Error: argumento -a en pos invalida\n"); else if( strcmp(argv[5],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[6]); if( strcmp(argv[3],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[4]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else if( strcmp(argv[3],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[4]); if( strcmp(argv[1],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[2]); if( strcmp(argv[5],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[6]); printf ("Error: argumento -a en pos invalida\n");

24 else if( strcmp(argv[5],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[6]); if( strcmp(argv[1],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[2]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else if( strcmp(argv[5],"-p") == 0 ) { //copia el puerto en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[6]); if( strcmp(argv[1],"-n") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[2]); if( strcmp(argv[3],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[4]); printf ("Error: argumento -a en pos invalida\n"); else if( strcmp(argv[3],"-n") == 0 ) {

25 //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[2],argv[4]); if( strcmp(argv[1],"-a") == 0 ) { else { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[3],argv[2]); printf ("Error: argumento -a en pos invalida\n"); else { printf ("Error: argumento -n en pos invalida\n"); else { printf ("Error: argumento -p en pos invalida\n"); else { printf ("Error: argumento -h en pos invalida\n"); InsertarPalabra (cola, retorno[0]); InsertarPalabra (cola, retorno[1]); InsertarPalabra (cola, retorno[2]); InsertarPalabra (cola, retorno[3]);

26 /* Proyecto 1: Redes ci4815 Programa: SocketCliente.h Realizado por: Lairon Acosta Version: 1.5 /*Definiciones de tipos y estructuras de datos /* Estructura para manejar los comandos del archivo var1: contenido del archivo var2: id de usuario al que le pertenece el archivo typedef struct parametros { char texto[300]; int idsocketusuario; Parametros; /*******Definiciones de metodos******* /*funcion: realiza conexion de sockets con el servidor arg1: direccion ip o nombre de maquina del cliente arg2: puerto donde recibira la conexion return: descriptor de conexion int ConexionInet (char *host, char *puerto); /*funcion: envia mensajes al servidor arg1: descriptor de conexion void *enviarmensaje ( void *id_hilo ); /*funcion: recibe mensajes del servidor arg1: descriptor de conexion void *recibirmensaje ( void *id_hilo ); /*funcion: procesa los argumentos de la llamada Cliente arg1: cantidad de argumentos arg2: lista de argumentos arg3: cola que saldra modificada void procesarargumentoscliente(int numeroarg, char *argv[], Cola *cola); /*funcion: envia comandos de un archivo al servidor arg1: id de usuario a que pertenece el archivo arg2: nombre del archivo int: 1 si envio comandos exitosamente, 0 sino. int enviarcomandos(int id, char *archivo);

27 /* Proyecto 1: Redes ci4815 Programa: Servidor.c Realizado por: Lairon Acosta Version: Includes del sistema #include <stdio.h> #include <string.h> #include <stdlib.h> #include <Cola.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <pthread.h> #include <sys/syscall.h> #include <sys/resource.h> #include <SocketServidor.h> /*funcion: administra los comandos enviados por el cliente arg1: descriptor de conexion void *funcionesusuario( void *p); //VARIABLES GLOBALES datausuario usuario[100]; salausuario sistemasala[150]; int clientes = 0; pthread_mutex_t mutex; /*funcion: funcion principal que realiza las acciones de un servidor argc: cantidad de argumentos argv: argumentos de la llamada del cliente main(int argc, char *argv[]) { //Declaracion de variables Cola cola = NULL; char puerto[100]; char sala[100]; char Cadena[100]; char nombreuser[147]; int fd_socket, fd_socketcliente, i, rc; int id; pthread_t threads[100];

28 //Inicializacion de variales pthread_mutex_init (&mutex, NULL); //inicializa el mutex //bloquear area compartida, mutex pthread_mutex_lock (&mutex); for( i=0 ; i<100 ; i++ ) { strcpy( usuario[i].nombreusuario, " "); // Comando de entrada: schat [-p <puerto>] [-s <sala>] if ( argc == 5 ) { /* llamo a funcion que identificara la correspondencia de los argumentos del programa principal procesarargumentosservidor(argc, argv, &cola); strcpy(puerto, dameprimero(&cola)); //Obtengo host strcpy(sala, dameprimero(&cola)); //Obtengo puerto cola=null; //destruccion de la cola free(cola); else if( argc == 4 ) { /* llamo a funcion que identificara la correspondencia de los argumentos del programa principal procesarargumentosservidor2(argc, argv, &cola); strcpy(puerto, dameprimero(&cola)); //Obtengo host strcpy(sala, dameprimero(&cola)); //Obtengo puerto cola=null; //destruccion de la cola free(cola); else { printf ("Programa %s.c: Error: numero invalido de argumentos.\n", argv[0]); exit(-1); //incorporo el numero de salas strcpy(sistemasala[0].nombresala, "tamaño"); sistemasala[0].numerosala = 1; //incorporo la sala por defecto en el arreglo de salas

29 strcpy(sistemasala[1].nombresala, sala); sistemasala[1].numerosala = 1; //Almaceno al servidor como usuario por defecto //Almaceno la sala por defecto id = clientes; usuario[id].idsocket = 0; strcpy(usuario[id].nombreusuario, "Servidor"); usuario[id].conectadousuario = 1; //strcpy(usuario[id].nombresala, sala); InsertarPalabra(&usuario[id].salas, sala); //aumento clientes para comenzar a recibir clientes++; //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); // Inicia configuracion de conexion de Sockets //Se abre la conexion con el servidor fd_socket = ConexionInetServidor(puerto); if ( fd_socket == -1 ) { printf("error DE CONEXION INET\n"); exit(-1); //Me quedo esperando peticiones de usuarios para aceptar for (;;) { //Servidor espera solicitudes del cliente fd_socketcliente = AceptaConexionInetCliente(fd_socket); if ( fd_socketcliente == -1 ) { printf ("Error al aceptar solicitudes de clientes\n"); exit (-1); else { //bloquear area compartida, mutex pthread_mutex_lock (&mutex); id = clientes; //le asigna id a usuario nuevo //almaceno fd_socket de usuario usuario[id].idsocket = fd_socketcliente; //si la sala por defecto fue eliminada if(sistemasala[1].numerosala == -1) { //marco usuario como desconectado

30 usuario[id].conectadousuario = 0; usuario[id].salas = NULL; else { //marco usuario como conectado usuario[id].conectadousuario = 1; //almaceno nombre sala de usuario InsertarPalabra(&usuario[id].salas, sala); //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //para recibir nombre de usuario recv(usuario[id].idsocket, nombreuser, 100, 0); //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //almaceno nombre de usuario strcpy(usuario[id].nombreusuario,nombreuser); strcpy(nombreuser, ""); clientes++; //aumento el numero de clientes //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); (intptr_t)id)) ) { //creo hilo por cada cliente aceptado y proceso su peticion if ( (rc = pthread_create( &threads[id], NULL, funcionesusuario, (void *) printf("error al crear el hilo de funciones de usuarios\n"); close(id); exit(-1); //Espero por los hilos de clientes que se estan procesando pthread_join( threads[id], NULL); //Se cierran los sockets close (fd_socketcliente); //cliente close (fd_socket); //servidor void *funcionesusuario( void *p) { int ide; ide = (int)(intptr_t)p;

31 char buffer[300]; char funcion[147]; char mensaje[300]; char nombreauxiliar[147]; char nombreauxiliar2[147]; int i, longitud, destino,j=0,e=0,tam=0,numsalas=0; //expresiones regulares para los formatos de comandos y parametros char expmensaje[] = " *men *[a-za-z0-9.,-?'!\"#$%&/()@+-/*\\][a-za-z 0-9.,-?'!\"#$%&/ ()@+-/*\\]* *$"; char expcrearsala[] = " *cre *[a-za-z0-9][a-za-z0-9]* *$"; char expsuscribesala[] = " *sus *[a-za-z0-9][a-za-z0-9]* *$"; char expeliminasala[] = " *eli *[a-za-z0-9][a-za-z0-9]* *$"; char expsalas[] = " *sal *$"; char expusuarios[] = " *usu *$"; char expdessuscribir[] = " *des *$"; char expfuerachat[] = " *fue *$"; //me quedo esperando comandos por cliente cualquiera while(1) { j=0; e=0; tam=0; numsalas=0; recv(usuario[ide].idsocket, buffer, 300, 0); longitud = strlen(buffer); buffer[longitud-1]='\0'; //vacio buffers strcpy( nombreauxiliar2, ""); //vacio buffers strcpy( nombreauxiliar, ""); //guardo el nombre del usuario en otra variable strcpy( nombreauxiliar2, usuario[ide].nombreusuario); printf ("%s: %s\n",nombreauxiliar2, buffer); /*****************************COMANDOS******************************** //envio mensaje a todos los usuarios conectados a la misma //sala del servidor if( formatovalido( expmensaje, buffer) == 1 ) { //bloquear area compartida, mutex pthread_mutex_lock (&mutex);

32 //obtengo nombre de comando y parametro strcpy(funcion, primerapalabra(buffer, longitud)); //guardo el nombre del usuario en otra variable strcpy( nombreauxiliar, usuario[ide].nombreusuario); //concateno para mejorar el formato del mensaje a enviar strcat( nombreauxiliar, " dice: "); strcat( nombreauxiliar, buffer); strcat( mensaje, nombreauxiliar); //envio mensaje para cada usuario for(i = 1; i < clientes; i++) { //que sea distinto a mi mismo y que este conectado if( i!= ide && usuario[i].conectadousuario == 1) { //numero de salas a la que esta suscrito el //usuario ide. tam = tamano(&usuario[ide].salas); //cada elemento de la cola de Salas de usuario for(j=1 ; j <= tam; j++) { //si otro usuario pertenece a mis salas if( pertenece( &usuario[i].salas, elemento(&usuario[ide ].salas,j) ) ) { j = tam+1; //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[i].idsocket, mensaje, strlen(mensaje) +1, 0); //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //vacio buffers strcpy( mensaje, ""); strcpy( buffer, ""); strcpy( nombreauxiliar, ""); //la peticion es mostrar las salas que posee el servidor else if( formatovalido( expsalas, buffer) == 1 ) {

33 //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //obtengo el numero de salas en el servidor numsalas = sistemasala[0].numerosala; //concateno para mejorar formato de mensaje respuesta strcat( mensaje, "Salas del servidor: \n"); //almaceno las salas activas actuales for(i = 1; i <= numsalas; i++) { //si la sala no fue eliminada if(sistemasala[i].numerosala!= -1) { //concateno para mejorar formato de mensaje respuesta strcat( mensaje, sistemasala[i].nombresala); strcat( mensaje, "\n"); //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); strcpy( mensaje, ""); strcpy( buffer, ""); //La peticion del usuario es crear una sala en el servidor. else if( formatovalido( expcrearsala, buffer) == 1 ) { //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //obtengo nombre de comando y parametro strcpy(funcion, primerapalabra(buffer, longitud)); //obtengo el numero de salas en el servidor numsalas = sistemasala[0].numerosala; //se verifica si la sala ya existe for(i = 1; i <= numsalas ; i++) { //si encontro la sala, cambia la bandera 'j' a true if(strcmp(sistemasala[i].nombresala, buffer) == 0 && sistemasala[i ].numerosala!= -1) { //cambio bandera a true j = 1; //termino ciclo i = numsalas + 1; //sino existe la sala proceso peticion accion

34 if ( j == 0 ) { //concateno para mejorar formato de mensaje respuesta strcat( mensaje, "Se ha creado la sala "); strcat( mensaje, "\""); strcat( mensaje, buffer); strcat( mensaje, "\""); strcat( mensaje, " satisfactoriamente.\n"); //aumento el numero de salas sistemasala[0].numerosala++; //obtengo el numero de salas en el servidor numsalas = sistemasala[0].numerosala; //guardo el numerosala de la nueva sala sistemasala[numsalas].numerosala = numsalas; //guardo el nombre de la nueva sala strcpy( sistemasala[numsalas].nombresala, buffer ); //agrego sala a cola de salas de usuario InsertarPalabra(&usuario[ide].salas,buffer); //coloco al usuario como conectado a la sala nueva usuario[ide].conectadousuario = 1; //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); //si la sala ya existe, envio respuesta else { //concateno para mejorar formato de mensaje de respuesta strcat( mensaje, "La sala ya existe. \n"); //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); //vacio buffers strcpy( mensaje, ""); strcpy( buffer, ""); //la peticion es mostrar una lista todos los usuarios conectados else if ( formatovalido( expusuarios, buffer) == 1 ) { //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //concateno para mejorar el formato de mensaje a enviar

35 strcat( mensaje, "Usuarios conectados: \n"); //para cada cliente verifico for(i = 1; i < clientes; i++) { //si el usuario esta conectado if( usuario[i].conectadousuario == 1 ) { //lo concateno con usuarios conectados strcat( mensaje, usuario[i].nombreusuario); strcat( mensaje, "\n"); j=1; //hay usuarios conectados if (j==1) { //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); else { strcpy( mensaje, ""); //concateno para mejorar el formato de mensaje a enviarcomandos strcat( mensaje, "No hay Usuarios conectados\n"); //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); //vacio buffers strcpy( mensaje, ""); strcpy( buffer, ""); //el usuario se suscribe a una sala else if( formatovalido( expsuscribesala, buffer) == 1 ) { //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //obtengo nombre de comando y parametro strcpy(funcion, primerapalabra(buffer, longitud)); //obtengo el numero de salas en el servidor numsalas = sistemasala[0].numerosala; //se verifica si la sala ya existe for(i = 1; i <= numsalas ; i++) { //si encontro la sala, cambia la bandera 'j' a true if(strcmp(sistemasala[i].nombresala, buffer) == 0 && sistemasala[i ].numerosala!= -1) {

36 //cambio bandera a true j = 1; //termino ciclo i = numsalas + 1; //si existe la sala, proceso peticion accion if ( j == 1 ) { if( pertenece( &usuario[ide].salas, buffer ) ) { //concateno para mejorar formato de mensaje de respuesta strcat( mensaje, "Usted ya esta suscrito a esta sala. \n"); //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); else { //concateno para mejorar formato de mensaje respuesta strcat( mensaje, "Suscrito a la sala "); strcat( mensaje, "\""); strcat( mensaje, buffer); strcat( mensaje, "\""); strcat( mensaje, " satisfactoriamente.\n"); //agrego sala a cola de salas de usuario InsertarPalabra(&usuario[ide].salas,buffer); //coloco al usuario como conectado a la sala nueva usuario[ide].conectadousuario = 1; //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); //si la sala no existe, envio respuesta else { //concateno para mejorar formato de mensaje de respuesta strcat( mensaje, "La sala a suscribirse no existe. \n"); //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); //vacio buffers strcpy( mensaje, ""); strcpy( buffer, ""); //eliminar una sala del servidor else if( formatovalido( expeliminasala, buffer) == 1 ) {

37 //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //obtengo nombre de comando y parametro strcpy(funcion, primerapalabra(buffer, longitud)); //obtengo el numero de salas en el servidor numsalas = sistemasala[0].numerosala; //se verifica si la sala ya existe for(i = 1; i <= numsalas ; i++) { //si encontro la sala, cambia la bandera 'j' a true if(strcmp(sistemasala[i].nombresala, buffer) == 0 && sistemasala[i ].numerosala!= -1) { //elimino la sala sistemasala[i].numerosala = -1; //cambio bandera a true j = 1; //termino ciclo i = numsalas + 1; //si existe la sala, proceso peticion accion if ( j!= 0 ) { //concateno para mejorar formato de mensaje respuesta strcat( mensaje, "Sala "); strcat( mensaje, "\""); strcat( mensaje, buffer); strcat( mensaje, "\""); strcat( mensaje, " eliminada satisfactoriamente.\n"); //envio mensaje para cada usuario for(i = 1; i < clientes; i++) { if( eliminarelemento( &usuario[i].salas, buffer ) ) { //numero de salas a la que esta suscrito el //usuario ide. tam = tamano(&usuario[i].salas); //sino esta suscrito a mas salas, lo des-suscribo if(tam == 0) { //coloco al usuario como desconectado usuario[i].conectadousuario = 0; //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente

38 send( usuario[i].idsocket, mensaje, strlen(mensaje)+1, 0); //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //si la sala no existe, envio respuesta else { //concateno para mejorar formato de mensaje de respuesta strcat( mensaje, "La sala a eliminar no existe. \n"); //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); //vacio buffers strcpy( mensaje, ""); strcpy( buffer, ""); //el usuario se des-suscribe de todas las salas else if( formatovalido( expdessuscribir, buffer) == 1 ) { //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //guardo mensaje de des-suscripcion strcat( mensaje, "De-suscrito de todas las salas satisfactoriamente. \n"); //coloco al usuario como desconectado usuario[ide].conectadousuario = 0; //coloco al usuario sin ninguna sala usuario[ide].salas=null; //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); //vacio buffers strcpy( mensaje, ""); strcpy( buffer, ""); //el usuario termina la ejecucion de su cchat else if( formatovalido( expfuerachat, buffer) == 1 ) { //bloquear area compartida, mutex pthread_mutex_lock (&mutex); //obtengo nombre de comando strcpy(funcion, primerapalabra(buffer, longitud));

39 //coloco al usuario como fuera del servidor usuario[ide].conectadousuario = -1; //coloco al usuario sin ninguna sala usuario[ide].salas=null; //desbloquear area compartida, mutex pthread_mutex_unlock (&mutex); //envio respuesta al cliente send( usuario[ide].idsocket, funcion, strlen(funcion)+1, 0); //vacio buffers strcpy( mensaje, ""); strcpy( buffer, ""); //dejo de atender peticiones de este cliente break; else { //guardo mensaje de comando invalido strcat( mensaje, "\t'comando INVALIDO, SERVICIO NO ENCONTRADO'\n"); //envio respuesta al cliente send( usuario[ide].idsocket, mensaje, strlen(mensaje)+1, 0); //vacio buffers strcpy( mensaje, ""); strcpy( buffer, ""); fflush(stdout);

40 /* Proyecto 1: Redes ci4815 Programa: SocketServidor.c Realizado por: Lairon Acosta Version: Includes del sistema #include <stdio.h> #include <string.h> #include <stdlib.h> #include <Cola.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/syscall.h> #include <sys/resource.h> #include <errno.h> #include <sys/stat.h> #include <unistd.h> #include <dirent.h> #include <fcntl.h> #include <sys/time.h> #include <regex.h> #include <SocketServidor.h> /****Implementacion de metodos*** /*funcion: realiza conexion de sockets arg1: puerto donde se hara la conexion return: descriptor de conexion int ConexionInetServidor (char *puerto) { //Declaracion de variables int fd_socket; struct sockaddr_in address; struct in_addr inaddr; struct hostent *host_cliente; //Abrimos el socket if(( fd_socket = socket (PF_INET, SOCK_STREAM, 0)) < 0) { printf("error abriendo el socket\n"); return -1; // /*

41 * Se rellenan los campos de la estructura Direccion, necesaria * para la llamada a la funcion bind() address.sin_family = AF_INET; address.sin_addr.s_addr =INADDR_ANY; //verifica si se obtuvo error en el puerto if (!(address.sin_port = htons(atoi(puerto))) ) { //dir PUERTO printf("error en el puerto\n"); return -1; // if ( bind( fd_socket, (struct sockaddr *) &address, sizeof (address) ) == -1) { printf("error realizando el bind\n"); close (fd_socket); return -1; /* * Se avisa al sistema que comience a atender llamadas de clientes if (listen (fd_socket, 1) == -1) { printf("error realizando el listen\n"); close (fd_socket); return -1; /* * Se devuelve el descriptor del socket servidor return fd_socket; /*funcion: realiza la aceptacion de la conexion con el cliente arg1: descriptor de conexion return: descriptor de conexion int AceptaConexionInetCliente (int fd_socket) { socklen_t longitudcliente; struct sockaddr cliente; int acepta; /* * La llamada a la funcion accept requiere que el parametro * Longitud_Cliente contenga inicialmente el tamano de la * estructura Cliente que se le pase. A la vuelta de la * funcion, esta variable contiene la longitud de la informacion * util devuelta en Cliente

42 longitudcliente = sizeof (cliente); acepta = accept (fd_socket, &cliente, &longitudcliente); if (acepta == -1) { return -1; /* * Se devuelve el descriptor en el que esta "enchufado" el cliente. return acepta; /*funcion: procesa los argumentos de la llamada Servidor1 arg1: cantidad de argumentos arg2: lista de argumentos arg3: cola que saldra modificada void procesarargumentosservidor(int numeroarg, char *argv[], Cola *cola) { char retorno[3][50]; // Comando de entrada: schat [-p <puerto>] [-s <sala>] if( strcmp(argv[1],"-p") == 0 ) { //copia el nombre en la posicion 0 del arreglo retorno strcpy(retorno[0],argv[2]); if( strcmp(argv[3],"-s") == 0 ) { //copia el archivo en la posicion 1 del arreglo retorno strcpy(retorno[1],argv[4]); else { printf ("Error: argumento -s no corresponde\n"); else if( strcmp(argv[3],"-p") == 0 ) { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[0],argv[4]); if( strcmp(argv[1],"-s") == 0 ) { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[1],argv[2]);

43 else { printf ("Error: argumento -s no corresponde\n"); else { printf ("Error: argumento -p no corresponde\n"); InsertarPalabra (cola, retorno[0]); InsertarPalabra (cola, retorno[1]); /*funcion: procesa los argumentos de la llamada Servidor2 arg1: cantidad de argumentos arg2: lista de argumentos arg3: cola que saldra modificada void procesarargumentosservidor2(int numeroarg, char *argv[], Cola *cola) { char retorno[3][50]; // Comando de entrada: schat [-p <puerto>] [-s] // Comando de entrada: schat [-s] [-p <puerto>] if( strcmp(argv[1],"-p") == 0 ) { //copia el nombre en la posicion 0 del arreglo retorno strcpy(retorno[0],argv[2]); if( strcmp(argv[3],"-s") == 0 ) { //copia el archivo en la posicion 1 del arreglo retorno strcpy(retorno[1],"actual"); else { printf ("Error: argumento -s no corresponde\n"); else if( strcmp(argv[2],"-p") == 0 ) {

44 else { //copia el nombre en la posicion 2 del arreglo retorno strcpy(retorno[0],argv[3]); if( strcmp(argv[1],"-s") == 0 ) { //copia el archivo en la posicion 3 del arreglo retorno strcpy(retorno[1],"actual"); else { printf ("Error: argumento -s no corresponde\n"); printf ("Error: argumento -p no corresponde\n"); InsertarPalabra (cola, retorno[0]); InsertarPalabra (cola, retorno[1]); /*funcion: obtiene primera palabra de una cadena arg1: cadena arg2: tamano de cadena return: primera palabra de la cadena char * primerapalabra(char *cad, int tam) { char * palabra = malloc(100); int i,j=0; for( i=0 ; (i < tam && cad[i]!=' ' && cad[i]!='\n') ; i++) { palabra[j]=cad[i]; cad[i]=' '; j++; palabra[j]='\0'; j=0; i = i+1; for( i ; i < tam && cad[i]!='\n' ; i++) { cad[j]=cad[i]; j++; cad[j]='\0';

45 return palabra; /*funcion: verifica si una cadena es una expresion regular valida arg1: expresion regular aplicar arg2: cadena de texto a verificar int: 1 si match, 0 sino. int formatovalido(char *expresion, char *texto) { regex_t regex; int rec; char msgbuf[100]; /* Compila la expresion regular rec = regcomp(&regex, expresion, 0); //verifico error if( rec ) { fprintf(stderr, "No se pudo compilar la expresion regular\n"); regfree(&regex); return 0; /* Ejecuta la expresion regular rec = regexec(&regex, texto, 0, NULL, 0); if (!rec ) { regfree(&regex); return 1; else if ( rec == REG_NOMATCH ) { regfree(&regex); return 0; else { regerror(rec, &regex, msgbuf, sizeof(msgbuf)); fprintf(stderr, "Regex match fallo: %s\n", msgbuf); regfree(&regex); return 0; /* libera el compilador si quieres usar regex de nuevo regfree(&regex);

46 /* Proyecto 1: Redes ci4815 Programa: SocketServidor.h Realizado por: Lairon Acosta Version: 1.2 /*Definiciones de tipos y estructuras de datos /* Estructura para manejar los usuarios var1: id socket de usuarios var2: nombre del usuario var3: conectado o desconectado (var3 = 1 si usuario esta conectado) (var3 = 0 si usuario esta desconectado) var4: Cola de salas a la que esta suscrito typedef struct datos { int idsocket; char nombreusuario[100]; int conectadousuario; Cola salas; Data; //variable de tipo Datos de usuario typedef Data datausuario; /* Estructura para manejar las salas var1: nombre de la sala var2: numero de la sala (var2 = -1 si sala esta eliminada) (var2 = 1 si sala no esta eliminada) typedef struct salas { char nombresala[100]; int numerosala; Salas; //variable de tipo Datos de salas typedef Salas salausuario; /*******Definiciones de metodos******* /*funcion: realiza conexion de sockets arg1: puerto donde se hara la conexion return: descriptor de conexion int ConexionInetServidor (char *puerto);

47 /*funcion: realiza la aceptacion de la conexion con el cliente arg1: descriptor de conexion return: descriptor de conexion int AceptaConexionInetCliente (int fd_socket); /*funcion: procesa los argumentos de la llamada Servidor1 arg1: cantidad de argumentos arg2: lista de argumentos arg3: cola que saldra modificada void procesarargumentosservidor(int numeroarg, char *argv[], Cola *cola); /*funcion: procesa los argumentos de la llamada Servidor2 arg1: cantidad de argumentos arg2: lista de argumentos arg3: cola que saldra modificada void procesarargumentosservidor2(int numeroarg, char *argv[], Cola *cola); /*funcion: obtiene primera palabra de una cadena arg1: cadena arg2: tamano de cadena return: primera palabra de la cadena char * primerapalabra(char *cad, int tam); /*funcion: verifica si una cadena es una expresion regular valida arg1: expresion regular aplicar arg2: cadena de texto a verificar int: 1 si match, 0 sino. int formatovalido(char *expresion, char *texto);

48 /* Proyecto 1: Redes ci4815 Programa: Cola.c Realizado por: Lairon Acosta Version: 1.9 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <Cola.h> //funcion: inserta una palabra en la cola //out: la cola modificada void InsertarPalabra (Cola *cola, char *pal ) { apnodo nodo, nodoaux; if (((apnodo)malloc(sizeof(tipocaja)))==null) { printf("\nelemento no insertado por falta de memoria."); else { /*Creamos un nodo para el valor a insertar nodo = (apnodo)malloc(sizeof(tipocaja)); strcpy (nodo->palabra, pal); nodo->sig = NULL; /* si la cola está vacía, el *cola sera el nuevo nodo /* si no lo esta, insertamos el nuevo nodo al final de la cola if(*cola == NULL) { *cola = nodo; else { nodoaux = (*cola); while (nodoaux->sig!= NULL) { nodoaux = nodoaux->sig; nodoaux->sig = nodo; //funcion: borra una palabra de la cola //out: retorna 0 si borro o 1 sino borro int BorrarPrimero(Cola *cola) { apnodo nodo; int borro = 1; borro=1; //1= no borro, 0= si borro nodo = *cola; if (nodo == NULL) {

49 borro = 1; else { (*cola) = (*cola)->sig; nodo->sig = NULL; free(nodo); borro = 0; return (borro); //funcion: imprime la cola en pantalla //out: salida standar void ImprimirCola(Cola *cola) { apnodo nodo; nodo = *cola; if (cola!=null) { while (nodo->sig!= NULL){ printf(" -> %s ", nodo->palabra); printf("\n"); nodo = nodo->sig; printf(" -> %s ", nodo->palabra); printf("\n"); printf("\n"); else { printf(" Lista vacia\n\n"); //funcion: borra una palabra de la cola //out: retorna 0 si borro o 1 sino borro char * dameprimero(cola *cola) { apnodo nodo; int borro = 1; char *word =malloc(300); borro=1; //1= no borro, 0= si borro nodo = *cola; if (nodo == NULL) { borro = 1; else { strcpy(word,nodo->palabra); (*cola) = (*cola)->sig; nodo->sig = NULL; free(nodo); borro = 0; return word;

sockets Flujo (SOCK_STREAM) Comunicación bidireccional Confiable (entrega garantizada) Información ordenada en el destino Datagrama (SOCK_DGRAM)

sockets Flujo (SOCK_STREAM) Comunicación bidireccional Confiable (entrega garantizada) Información ordenada en el destino Datagrama (SOCK_DGRAM) s s Comunicación punto-a-punto entre procesos Los s son los extremos de la comunicación Diferentes dominios UNIX: Entre procesos de un mismo equipo Internet: Entre procesos de diferentes equipos (TCP/IP)

Más detalles

Introducción a la programación con sockets en C

Introducción a la programación con sockets en C Introducción a la programación con sockets en C Enrique Bonet Departamento de Informática Universidad de Valencia Índice Introducción Socket Creación de un socket Cierre de un socket Asociación de un socket

Más detalles

Problemas de Redes de Computadores. Conjunto de problemas 1

Problemas de Redes de Computadores. Conjunto de problemas 1 Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1 Pregunta 1.1: Si configuro mi servidor Web para que no acepte conexiones desde la dirección IP 130.206.1.1,

Más detalles

Examen Principios de Programación Febrero 2012

Examen Principios de Programación Febrero 2012 Por favor siga las siguientes indicaciones: Escriba con lápiz. Escriba su nombre y número de documento en todas las hojas que entregue. Numere las hojas e indique el total de hojas en la primera de ellas.

Más detalles

Sistemas Operativos Práctica 3

Sistemas Operativos Práctica 3 Sistemas Operativos Práctica 3 Ing. Andrés Bustamante afbustamanteg@unal.edu.co Ingeniería de Sistemas Facultad de Ingeniería Universidad de la Amazonia 2009 1. Objetivo El objetivo de la práctica es que

Más detalles

Sockets: funcionamiento y programación. Sockets tipo UNIX. MSc. Ivan A. Escobar

Sockets: funcionamiento y programación. Sockets tipo UNIX. MSc. Ivan A. Escobar Sockets tipo UNIX MSc. Ivan A. Escobar Creación socket: socket() int socket(familia, tipo, protocolo) Regresa un valor entero Parecido descriptor de archivos: descriptor socket sockfd int familia familia

Más detalles

Ejercicio Sockets Suma Resta. Descripción

Ejercicio Sockets Suma Resta. Descripción Ejercicio Sockets Suma Resta Siguiendo con nuestra propuesta de construir embriones de servicios, como hemos hecho en la práctica programando un embrión de Telnet, un embrión de cliente de un servidor

Más detalles

TELEPROCESO Y SISTEMAS DISTRIBUIDOS

TELEPROCESO Y SISTEMAS DISTRIBUIDOS Universidad Nacional del Nordeste TELEPROCESO Y SISTEMAS DISTRIBUIDOS La Interfaz Socket Lic. Vanesa S. Roffé Año 2009 Introducción - Origen de la INTERFAZ SOCKET La Interfaz Socket es una API para redes

Más detalles

SOLUCION EXAMEN junio 2006

SOLUCION EXAMEN junio 2006 SOLUCION EXAMEN junio 2006 1. Explique razonadamente si las siguientes afirmaciones son verdaderas o falsas: I) (1 p) En UNIX únicamente se distinguen dos tipos de procesos: los procesos de usuario y los

Más detalles

Manual de operación Tausend Monitor

Manual de operación Tausend Monitor Manual de operación Tausend Monitor Luego de haber realizado satisfactoriamente el proceso de instalación, al iniciar el programa le aparecerá la siguiente ventana: El usuario principal y con el primero

Más detalles

COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA

COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA Autor: Carlos Javier Martín González. Licenciado en Física Teórica por la Universidad Autónoma de Madrid. Analista programador y funcional. Desarrollador

Más detalles

7. Manejo de Archivos en C.

7. Manejo de Archivos en C. 7. Manejo de Archivos en C. Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos se almacenan normalmente en un dispositivo de

Más detalles

Manual del Protocolo XML-RPC de Mensajería Negocios

Manual del Protocolo XML-RPC de Mensajería Negocios Manual del Protocolo XML-RPC de Mensajería Negocios Índice de contenidos 1 INTRODUCCIÓN... 3 2 FUNCIONALIDADES DEL API DE COMUNICACIÓN XML-RPC... 4 2.1 Envío Libre... 4 2.2 Envío a Grupo de Contactos...

Más detalles

ARQUITECTURA DE REDES Laboratorio

ARQUITECTURA DE REDES Laboratorio 1nsloo.cl ARQUITECTURA DE REDES Laboratorio Práctica 2: Ejercicios de aplicación de Sockets en C 1. OBJETIVOS. El objetivo de esta práctica es que el alumno llegue a conocer los principales conceptos relacionados

Más detalles

Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP. Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011

Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP. Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011 Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011 Introducción Aplicaciones Distribuidas Su funcionalidad se distribuye

Más detalles

Sistemas Operativos Práctica 4

Sistemas Operativos Práctica 4 Sistemas Operativos Práctica 4 Ing. Andrés Bustamante afbustamanteg@unal.edu.co Ingeniería de Sistemas Facultad de Ingeniería Universidad de la Amazonia 2009 1. Objetivo El objetivo de la práctica es que

Más detalles

5.2.- Configuración de un Servidor DHCP en Windows 2003 Server

5.2.- Configuración de un Servidor DHCP en Windows 2003 Server 5.2.- Configuración de un Servidor DHCP en Windows 2003 Server En este apartado vamos a configurar el servidor DHCP de "Windows 2003 Server", instalado en el apartado anterior. Lo primero que hemos de

Más detalles

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */ Principios de Programación El lenguaje C 1. Variables locales y globales 1.1. Variables locales Las funciones permiten al programador modularizar un programa. Todas las variables declaradas en las definiciones

Más detalles

COMUNICACIÓN ENTRE PROCESOS SOCKETS

COMUNICACIÓN ENTRE PROCESOS SOCKETS COMUNICACIÓN ENTRE PROCESOS SOCKETS Diseño de Sistemas Operativos Curso 2007/08 Grupo: Mi30 Martín Santana, A. David Martínez Santana, Luis Ignacio Qué son?(definición) n) Los sockets son mecanismos de

Más detalles

Introducción a las Redes de Computadoras. Obligatorio 2 2011

Introducción a las Redes de Computadoras. Obligatorio 2 2011 Introducción a las Redes de Computadoras Obligatorio 2 2011 Facultad de Ingeniería Instituto de Computación Departamento de Arquitectura de Sistemas Nota previa - IMPORTANTE Se debe cumplir íntegramente

Más detalles

Introducción de Sockets en C.

Introducción de Sockets en C. PRÁCTICA 2: Introducción de Sockets en C. 1 La Interfaz Socket es una API para redes TCP/IP que se compone de funciones o rutinas. Originalmente se construyó a principios de los 80 para el sistema operativo

Más detalles

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS CONTENIDOS 1. Introducción a las cadenas 2. Definición 3. Declaración de cadenas 4. Inicialización de cadenas 5. Escritura y Lectura de datos tipo cadena 6. Funciones de manipulación de cadenas 7. Arrays

Más detalles

Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1

Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1 Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1 Preguntas cortas Pregunta 1.1: Si configuro mi servidor Web para que no acepte conexiones desde

Más detalles

Análisis y diseño del sistema CAPÍTULO 3

Análisis y diseño del sistema CAPÍTULO 3 Análisis y diseño del sistema CAPÍTULO 3 36 CAPÍTULO 3 Análisis y diseño del sistema En este capítulo se pretende realizar un análisis detallado de los requerimientos del software a desarrollar para la

Más detalles

OBJETIVOS. Explicar el manejo de archivos de texto. Explicar el manejo de archivos binarios. Desarrollar programas que usen archivos.

OBJETIVOS. Explicar el manejo de archivos de texto. Explicar el manejo de archivos binarios. Desarrollar programas que usen archivos. / OBJETIVOS Explicar el manejo de archivos de texto. Explicar el manejo de archivos binarios. Desarrollar programas que usen archivos. LABORATORIO 6 MANEJO DE ARCHIVOS DE TEXTO Y BINARIOS Msc. Walter Fernandez

Más detalles

Sockets (TCP) Tema 2.- Nivel de aplicación en Internet

Sockets (TCP) Tema 2.- Nivel de aplicación en Internet Sockets (TCP) Tema 2- Nivel de aplicación en Internet Dr Daniel Morató es de Computadores Ingeniero Técnico en Informática de Gestión, 2º curso Material parcialmente adaptado del libro Computer Networking:

Más detalles

CAPÍTULO HTML Y DHCP DE H0/H2-ECOM100 CONFIGURACIÓN. En este capítulo...

CAPÍTULO HTML Y DHCP DE H0/H2-ECOM100 CONFIGURACIÓN. En este capítulo... CONFIGURACIÓN HTML Y DHCP DE H0/H2-ECOM100 CAPÍTULO 56 6 En este capítulo... Características DHCP de H0/H2 -ECOM100...................6-2 Deshabilitando DHCP y asignando una DIRECCION IP estática.....6-2

Más detalles

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria. Punteros Definición Un puntero es un dato que contiene una dirección de memoria. NOTA: Existe una dirección especial que se representa por medio de la constante NULL (definida en ) y se emplea

Más detalles

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8 TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 1.1 VECTORES O ARRAYS UNIDIMENSIONALES 2 1.2 ARRAYS MULTIDIMENSIONALES 3 1.3 INICIALIZACIÓN DE ARRAYS 4 1.3.1 INICIALIZACIÓN DE ARRAYS SIN

Más detalles

Tutorial: Cómo realizar tu primer programa en C++ En el Sistema Operativo Windows

Tutorial: Cómo realizar tu primer programa en C++ En el Sistema Operativo Windows Tutorial: Cómo realizar tu primer programa en C++ En el Sistema Operativo Windows Lo primero que hay que tener en cuenta para poder hacer nuestro primer programa en C++ es que necesitamos ciertas herramientas

Más detalles

Instituto Politécnico Nacional

Instituto Politécnico Nacional Instituto Politécnico Nacional Secretaria Académica Dirección de Estudios Profesionales Escuela Superior de Ingeniería Mecánica y Eléctrica Unidad Culhuacan Ingeniería en Comunicaciones y Electrónica Academia

Más detalles

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero. Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero. Uso de Ficheros Todas las estructuras de datos vistas hasta ahora utilizan la

Más detalles

Características de un lenguaje ideal para robótica

Características de un lenguaje ideal para robótica COMUNICACIÓN MEDIANTE SOCKETS Enrique Ortega Edrodoso Ingeniería Técnica de Informática de Gestión Introducción Los vehículos autoguiados comerciales disponibles en la actualidad tienen una serie de inconvenientes

Más detalles

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia Introduccion al Lenguaje C Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia Introducción C es un lenguaje de programación creado en 1972 por

Más detalles

MANUAL DE USUARIO DE CUENTAS DE CORREO

MANUAL DE USUARIO DE CUENTAS DE CORREO MANUAL DE USUARIO DE CUENTAS DE CORREO Existen dos formas de consultar el correo, por Interfaz Web (Webmail), la cual se realiza desde un navegador de Internet, o mediante un cliente de Correo, tal como

Más detalles

INSTALACIÓN Y CONFIGURACION DNS WINDOWS SERVER 2003

INSTALACIÓN Y CONFIGURACION DNS WINDOWS SERVER 2003 INSTALACIÓN Y CONFIGURACION DNS WINDOWS SERVER 2003 INSTALACION DNS Vamos a la opción administrar su servidor Hacemos click en la opción agregar o quitar función para agregar el servicio de resolución

Más detalles

Organización de Computadoras

Organización de Computadoras Organización de Computadoras Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Segundo Cuatrimestre de 2015 Proyecto N 1 Programación en Lenguaje C El objetivo principal

Más detalles

Preliminares. Tipos de variables y Expresiones

Preliminares. Tipos de variables y Expresiones Preliminares. Tipos de variables y Expresiones Felipe Osorio Instituto de Estadística Pontificia Universidad Católica de Valparaíso Marzo 5, 2015 1 / 20 Preliminares Computadoras desarrollan tareas a un

Más detalles

PRÁCTICA 4 PASO DE MENSAJES

PRÁCTICA 4 PASO DE MENSAJES PRÁCTICA 4 PASO DE MENSAJES Introducción Cuando los procesos interactúan unos con otros pueden necesitar intercambiar información. Uno de los métodos posibles para conseguir esto es el paso de mensajes.

Más detalles

ALGUNAS AYUDAS PARA EL ACCESO AL AULA DIGITAL Contenido

ALGUNAS AYUDAS PARA EL ACCESO AL AULA DIGITAL Contenido ALGUNAS AYUDAS PARA EL ACCESO AL AULA DIGITAL Contenido Tabla de contenido 1 INFORMACIÓN PERSONAL... 2 1.1 Cómo ingresar al Aula Digital?... 2 1.2 Qué hacer si olvida su contraseña?... 2 1.3 Qué veo cuando

Más detalles

HOW TO SOBRE FIREWALL

HOW TO SOBRE FIREWALL HOW TO SOBRE FIREWALL 1- En este how to estaremos estableciendo algunas reglas con el firewall para bloquear el acceso, o permitirlo. Lo primero que haremos es abrir la consola, ubicada en aplicaciones,

Más detalles

Guías _SGO. Gestione administradores, usuarios y grupos de su empresa. Sistema de Gestión Online

Guías _SGO. Gestione administradores, usuarios y grupos de su empresa. Sistema de Gestión Online Guías _SGO Gestione administradores, usuarios y grupos de su empresa Sistema de Gestión Online Índice General 1. Parámetros Generales... 4 1.1 Qué es?... 4 1.2 Consumo por Cuentas... 6 1.3 Días Feriados...

Más detalles

Comisión Nacional de Bancos y Seguros

Comisión Nacional de Bancos y Seguros Comisión Nacional de Bancos y Seguros Manual de Usuario Capturador de Pólizas División de Servicios a Instituciones Financieras Mayo de 2011 2 Contenido 1. Presentación... 3 1.1 Objetivo... 3 2. Descarga

Más detalles

Memoria compartida y semáforos r/w. La página del manual que podría servir para describir estas funciones es la siguiente:

Memoria compartida y semáforos r/w. La página del manual que podría servir para describir estas funciones es la siguiente: (3 ptos) Memoria Compartida y Semáforos R/W 1. Objetivo En esta práctica se pretende crear una librería que dé la funcionalidad de un semáforo para resolver problemas con múltiples lectores y escritores

Más detalles

GUIA COMPLEMENTARIA PARA EL USUARIO DE AUTOAUDIT. Versión N 02 Fecha: 2011-Febrero Apartado: Archivos Anexos ARCHIVOS ANEXOS

GUIA COMPLEMENTARIA PARA EL USUARIO DE AUTOAUDIT. Versión N 02 Fecha: 2011-Febrero Apartado: Archivos Anexos ARCHIVOS ANEXOS ARCHIVOS ANEXOS Son los documentos, hojas de cálculo o cualquier archivo que se anexa a las carpetas, subcarpetas, hallazgos u otros formularios de papeles de trabajo. Estos archivos constituyen la evidencia

Más detalles

SISTEMA DE APARTADO DE SALAS PARA EVENTOS

SISTEMA DE APARTADO DE SALAS PARA EVENTOS SISTEMA DE APARTADO DE SALAS PARA EVENTOS Dirección General de Comunicaciones e Informática Febrero 2008 1 INDICE 1. Objetivos del Sistema... 3 10. Solución de problemas... 23 2. Introducción... 4 3. Requisitos...

Más detalles

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1.

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1. Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1. Anjuta es un entorno de desarrollo de C que podemos encontrar en cualquier distribución de GNU/Linux. Si nuestra distribución no dispone de ella,

Más detalles

Uso del Shield Ethernet con Arduino

Uso del Shield Ethernet con Arduino CREATIVIDAD AHORA Uso del Shield Ethernet con Arduino Tutorial Arduino Creatividad Ahora 5/26/2014 Lunes, 26 de mayo de 2014 2 Tutorial del Manejo del Shield Ethernet R3 1. Introducción Hoy en día donde

Más detalles

Conexión a red LAN con servidor DHCP

Conexión a red LAN con servidor DHCP Introducción Explicación Paso 1 Paso 2 Paso 3 Paso 4 Paso 5 Paso 6 Paso 7 Paso 8 Paso 9 Paso 10 Materiales: Disco de sistema operativo. Tiempo: 5 minutos Dificultad: Baja Descripción Proceso que permite

Más detalles

Esquema de un programa en C: bloques básicos

Esquema de un programa en C: bloques básicos Esquema de un programa en C: bloques básicos // Incluimos los ficheros de cabecera que necesitemos. // Esto es un comentario #include #include // Si queremos definir alguna constante,

Más detalles

Modulo 1 El lenguaje Java

Modulo 1 El lenguaje Java Modulo 1 El lenguaje Java 13 - Codificación en Java Una de las grandes diferencias entre Java y Pascal en cuando a la codificación es que Java se trata de un lenguaje de los llamados case sensitive Esto

Más detalles

En caso de que el cliente nunca haya obtenido una concesión de licencia de un servidor DHCP:

En caso de que el cliente nunca haya obtenido una concesión de licencia de un servidor DHCP: Servidor DHCP El protocolo de configuración dinámica de host (DHCP, Dynamic Host Configuration Protocol) es un estándar TCP/IP diseñado para simplificar la administración de la configuración IP de los

Más detalles

MANUAL DE LA APLICACIÓN HELP DESK

MANUAL DE LA APLICACIÓN HELP DESK CASAMOTOR MANUAL DE LA APLICACIÓN HELP DESK Desarrollado por: NOVIEMBRE, 2012 BOGOTÁ D.C. - COLOMBIA INTRODUCCIÓN Este documento es el manual de la aplicación de Help Desk de Casamotor, producto desarrollado

Más detalles

Dirección Alumnos. Av. Benjamín Aráoz 800 - C.P. 4000 - Tucumán - Argentina Tels.: 0054 (0381) 4847355 Fax: 4310171 - Internet: www.filo.unt.edu.

Dirección Alumnos. Av. Benjamín Aráoz 800 - C.P. 4000 - Tucumán - Argentina Tels.: 0054 (0381) 4847355 Fax: 4310171 - Internet: www.filo.unt.edu. Perfil docente Interfaz en general para el perfil docente Inicio de sesión Al ingresar el docente tiene la opción de Ver mensajes que haya enviado la unidad académica a todos los docentes o alguno propio

Más detalles

Mecanismos IPC: sockets

Mecanismos IPC: sockets Mecanismos IPC: sockets Ampliación de Sistemas Operativos (prácticas) E.U. Informática en Segovia Universidad de Valladolid Sockets Los sockets son una abstracción lógica que permiten la comunicación bidireccional

Más detalles

Cómo ingresar a la Sucursal Electrónica?

Cómo ingresar a la Sucursal Electrónica? Tabla de Contenidos Cómo ingresar a la Sucursal Electrónica? 2 Página Principal 3 Cómo consultar o eliminar colaboradores o proveedores en mi plan de Proveedores o Planillas? 4 Consultas y Exclusiones

Más detalles

Guía Notas Parciales. Intermedio

Guía Notas Parciales. Intermedio Guía Notas Parciales Intermedio ÍNDICE I. INTRODUCCIÓN 3 II. CREAR LA ESTRUCTURA DE NOTAS PARCIALES (OPCIÓN NOTAS NORMALES) 4 III. CREAR LA ESTRUCTURA DE NOTA FINAL (OPCIÓN NOTAS CALCULAS) 6 IV. INGRESAR

Más detalles

Pantalla ENW URL LOGIN

Pantalla ENW URL LOGIN Pantalla ENW URL LOGIN 2 Opciones de recuperación Desde Web of Science / Web of Knowledge Desde catálogos de bibliotecas online o base de datos online. De forma manual Importación de archivos generados

Más detalles

SMS Plus Qué es? Cómo funciona?

SMS Plus Qué es? Cómo funciona? SMS Plus Qué es? Es un servicio para respaldar los SMS que envíes o recibas de otras personas, que te permite administrarlos como si fuera la bandeja de entrada del correo electrónico, y configurar además

Más detalles

OPERACIONES BASICAS. 1. Menú. 2. Barra de Herramientas. 3. Área de trabajo. 3.1 Operaciones Básicas. Revisión 3.0

OPERACIONES BASICAS. 1. Menú. 2. Barra de Herramientas. 3. Área de trabajo. 3.1 Operaciones Básicas. Revisión 3.0 OPERACIONES BASICAS Para iniciar el software EDC IDSE V 3.00 lo primero que debemos hacer es abrir el programa en el menú Inicio de Windows, Programas, EDCIDSE y luego EDCIDSE 3.0 Cuando inicia el EDC

Más detalles

Tema 4 El paradigma cliente-servidor

Tema 4 El paradigma cliente-servidor Tema 4 El paradigma cliente-servidor F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García Sistemas Distribuidos Grado en Ingeniería Informática Universidad Carlos III de

Más detalles

Capitulo 5. Implementación del sistema MDM

Capitulo 5. Implementación del sistema MDM Capitulo 5. Implementación del sistema MDM Una vez que se concluyeron las actividades de análisis y diseño se comenzó la implementación del sistema MDM (Manejador de Documentos de MoProSoft). En este capitulo

Más detalles

Arranque de la aplicación

Arranque de la aplicación Arranque de la aplicación Acceso autorizado Al ejecutar la aplicación se solicita un nombre de usuario y una clave de acceso. Esto garantiza el acceso a la información de las personas autorizadas. Usuarios

Más detalles

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACION DE COMPUTACIÓN PROYECTO DE CÁTEDRA. MATERIA: Introducción a la Programación

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACION DE COMPUTACIÓN PROYECTO DE CÁTEDRA. MATERIA: Introducción a la Programación UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACION DE COMPUTACIÓN CICLO 01-2015 PROYECTO DE CÁTEDRA MATERIA: Introducción a la Programación Indicaciones generales: El proyecto a continuación,

Más detalles

Introducción a la programación orientada a objetos

Introducción a la programación orientada a objetos Introducción a la programación orientada a objetos 1. Introducción a la programación orientada a objetos 2. Las clases 3. El tipo Struct 4. Diferencias entre Class y Struct 5. Pilares de la Programación

Más detalles

Estructuras y funciones de programación de sockets.

Estructuras y funciones de programación de sockets. Estructuras y funciones de programación de sockets. Introducción. En estos apuntes se incluye una breve descripción de las estructuras y funciones cuyo uso puede ser necesario para el desarrollo de las

Más detalles

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante) 1. : La clase Cuenta. Uso de la clase Cuenta 3. Métodos y objetos receptores de mensajes (Importante) 1 Una clase para cuentas de un banco Vamos a modelar con una clase, un nuevo tipo de datos, donde los

Más detalles

Sociedad de Seguros de Vida del Magisterio Nacional. Sistema de Pignoraciones Web. Manual de Usuario. Marzo, 2012.

Sociedad de Seguros de Vida del Magisterio Nacional. Sistema de Pignoraciones Web. Manual de Usuario. Marzo, 2012. Sociedad de Seguros de Vida del Magisterio Nacional Sistema de Pignoraciones Web Manual de Usuario Marzo, 2012. Elaborado por: Ing. Isaías Chavarría Mora. 1 Contenido 2 Introducción... 4 3 Consideraciones

Más detalles

Tema: Sobrecarga de Operadores.

Tema: Sobrecarga de Operadores. Programación II. Guía 7 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación II Tema: Sobrecarga de Operadores. Objetivos Describir como redefinir (sobrecargar) operadores para que funcionen

Más detalles

CONFIGURACION AVANZADA DE MOZILLA THUNDERBIRD

CONFIGURACION AVANZADA DE MOZILLA THUNDERBIRD CONFIGURACION AVANZADA DE MOZILLA THUNDERBIRD Carpetas sin Conexión... 2 Gestión de mensajes enviados... 3 Gestión de mensajes eliminados... 6 Firma Digital... 8 Envío de mensajes firmados digitalmente...

Más detalles

WINDOWS 2008 4: SERVIDOR DHCP

WINDOWS 2008 4: SERVIDOR DHCP 1.- CONCEPTOS PREVIOS: WINDOWS 2008 4: SERVIDOR DHCP DHCP (Dynamic Host Configuration Protocol = protocolo de configuración dinámica de host) es un protocolo que simplifica la configuración de los parámetros

Más detalles

Descripción del Problema Sistema de Reservaciones de Vuelos

Descripción del Problema Sistema de Reservaciones de Vuelos Requisitos: Descripción del Problema Weitzenfeld 1 Descripción del Problema Sistema de Reservaciones de Vuelos El Sistema de Reservaciones de Vuelos es un sistema que permite al usuario hacer consultas

Más detalles

Análisis Experimental de la Transmisión de Datos

Análisis Experimental de la Transmisión de Datos UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA DEPARTAMENTO DE ELECTRÓNICA Análisis Experimental de la Transmisión de Datos ELO322 Redes de Computadores I Pablo Ahumada D. Jorge Cápona G. Resumen Se muestra

Más detalles

Cómo crear su perfil de WOK?

Cómo crear su perfil de WOK? Cómo crear su perfil de WOK? Haga clic en este enlace para llenar el formulario y registrarse por primera vez. Si usted ya es un usuario registrado, escriba sus datos y presione el botón Sign in para

Más detalles

SOR -::- Prácticas -::- Curso 05/06. RCP es un estándar desarrollado por Sun Microsystems y usado por muchos distribuidores de sistemas UNIX.

SOR -::- Prácticas -::- Curso 05/06. RCP es un estándar desarrollado por Sun Microsystems y usado por muchos distribuidores de sistemas UNIX. RPC RCP es un estándar desarrollado por Sun Microsystems y usado por muchos distribuidores de sistemas UNIX. El RPC es una interfaz de programación de aplicación (API) disponible para el desarrollo de

Más detalles

Acronis License Server. Guía del usuario

Acronis License Server. Guía del usuario Acronis License Server Guía del usuario TABLA DE CONTENIDO 1. INTRODUCCIÓN... 3 1.1 Generalidades... 3 1.2 Política de licencias... 3 2. SISTEMAS OPERATIVOS COMPATIBLES... 4 3. INSTALACIÓN DE ACRONIS LICENSE

Más detalles

SIIGO PYME PLUS. Proceso de Recuperación. Cartilla I

SIIGO PYME PLUS. Proceso de Recuperación. Cartilla I SIIGO PYME PLUS Proceso de Recuperación Cartilla I Tabla de Contenido 1. Presentación 2. Qué es el Proceso de Recuperación? 3. Cuál es el Objetivo del Proceso de Recuperación? 4. Cuáles son los Pasos que

Más detalles

Crear un servidor DHCP

Crear un servidor DHCP Rocío Alt. Abreu Ortiz 2009-3393 Crear un servidor DHCP DHCP (Dynamic Host Configuration Protocol) es un protocolo de red que permite a los nodos de una red IP obtener sus parámetros de configuración automáticamente.

Más detalles

Configuracion Escritorio Remoto Windows 2003

Configuracion Escritorio Remoto Windows 2003 Configuracion Escritorio Remoto Windows 2003 Instalar y configurar servicio de Terminal Server en Windows 2003 Fecha Lunes, 25 diciembre a las 17:04:14 Tema Windows (Sistema Operativo) Os explicamos cómo

Más detalles

SCHOOL OF HACKING 2015 RETO BUFFER OVERFLOW

SCHOOL OF HACKING 2015 RETO BUFFER OVERFLOW SCHOOL OF HACKING 2015 RETO BUFFER OVERFLOW INSTRUCCIONES Para la resolución del reto habrá que tener una máquina física o virtual Linux instalada al menos con las siguientes características: - Compilador

Más detalles

El lenguaje de Programación C. Fernando J. Pereda <ferdy@gentoo.org>

El lenguaje de Programación C. Fernando J. Pereda <ferdy@gentoo.org> El lenguaje de Programación C Fernando J. Pereda Por qué aprender C? Portable y muy extendido Estándar (C89, C99) El lenguaje de los sistemas Un lenguaje fácil (no, no es broma) Por

Más detalles

Administración de la producción. Sesión 10: Gestor de Base de Datos (Access)

Administración de la producción. Sesión 10: Gestor de Base de Datos (Access) Administración de la producción Sesión 10: Gestor de Base de Datos (Access) Contextualización Microsoft Access es un sistema de gestión de bases de datos, creado para uso personal y de pequeñas organizaciones,

Más detalles

Listas, Pilas, Colas y Punteros. Semana 3

Listas, Pilas, Colas y Punteros. Semana 3 Listas, Pilas, Colas y Punteros Semana 3 Dictado por Marco González Núñez 14 de Febrero de 2011 Estructuras de datos simples Hoy hablaremos de lo que sin duda me motivó a crear este curso que son los punteros,

Más detalles

INSTITUTO TECNOLÓGICO DE COLIMA LIC. EN INFORMÁTICA

INSTITUTO TECNOLÓGICO DE COLIMA LIC. EN INFORMÁTICA INSTITUTO TECNOLÓGICO DE COLIMA LIC. EN INFORMÁTICA TERMINAL SERVER TUTOR: JORGE CASTELLANOS MORFIN 19/02/2012 VILLA DE ALVARES, COLIMA Indice Introducción... 3 Objetivo... 3 Lista de Materiales... 3 Procedimiento...

Más detalles

Gestión de Permisos. Bizagi Suite. Copyright 2014 Bizagi

Gestión de Permisos. Bizagi Suite. Copyright 2014 Bizagi Gestión de Permisos Bizagi Suite Gestión de Permisos 1 Tabla de Contenido Gestión de Permisos... 3 Definiciones... 3 Rol... 3 Perfil... 3 Permiso... 3 Módulo... 3 Privilegio... 3 Elementos del Proceso...

Más detalles

MANUAL DE USUARIO CONSEJO PUEBLA DE LECTURA A.C. Instituto Nacional de Astrofísica, Óptica y Electrónica. 01/Octubre/2009

MANUAL DE USUARIO CONSEJO PUEBLA DE LECTURA A.C. Instituto Nacional de Astrofísica, Óptica y Electrónica. 01/Octubre/2009 MANUAL DE USUARIO CONSEJO PUEBLA DE LECTURA A.C. Instituto Nacional de Astrofísica, Óptica y Electrónica 01/Octubre/2009 2 INDICE 1. Introducción (3) 2. Funcionalidades (3) 3. Seccion I (3) 3.1 Ingresando

Más detalles

LABORATORIO 2. La biblioteca a nivel de usuario semso (semáforos Sistemas Operativos) brinda las siguientes primitivas:

LABORATORIO 2. La biblioteca a nivel de usuario semso (semáforos Sistemas Operativos) brinda las siguientes primitivas: 1 Introducción LABORATORIO 2 En esta tarea se desea implementar un servicio sincronización de procesos a través de semáforos binarios con prioridad para el sistema operativo Linux. Para esto se deberá

Más detalles

CheckOUT HELP DESK. Una vez en sesión, UD. Podrá registrar problemas, consultas y hacer un seguimiento de los problemas que UD. ha ingresado.

CheckOUT HELP DESK. Una vez en sesión, UD. Podrá registrar problemas, consultas y hacer un seguimiento de los problemas que UD. ha ingresado. CheckOUT HELP DESK CHECKOUT IT implementará un cambio en el modo de atención en el servicio de Soporte Técnico. De ahora en más, UD. podrá registrar los problemas, consultas, etc. que esté teniendo con

Más detalles

Práctica GESTIÓN Y UTILIZACIÓN DE REDES LOCALES. Curso 2001/2002. TCP/IP: protocolo TCP

Práctica GESTIÓN Y UTILIZACIÓN DE REDES LOCALES. Curso 2001/2002. TCP/IP: protocolo TCP Práctica 9 GESTIÓN Y UTILIZACIÓN DE REDES LOCALES Curso 2001/2002 TCP/IP: protocolo TCP Introducción Como se ha comentado en la práctica anterior, el protocolo UDP es muy sencillo de implementar, pero

Más detalles

Abelardo Pardo. Iria Estévez Ayres. Damaris Fuentes Lorenzo. Pablo Basanta Val. Pedro J. Muñoz Merino. Hugo A. Parada.

Abelardo Pardo. Iria Estévez Ayres. Damaris Fuentes Lorenzo. Pablo Basanta Val. Pedro J. Muñoz Merino. Hugo A. Parada. Arquitectura de sistemas Abelardo Pardo University of Sydney School of Electrical and Information Engineering NSW, 2006, Australia Autor principal del curso de 2009 a 2012 Iria Estévez Ayres Damaris Fuentes

Más detalles

SISTEMA DE ATENCIÓN y GESTIÓN MANUAL DEL USUARIO. SAyGeS v2.0

SISTEMA DE ATENCIÓN y GESTIÓN MANUAL DEL USUARIO. SAyGeS v2.0 SAyGeS v2.0 1. Usuario 1.1. INGRESO Ingrese usuario y contraseña. Posteriormente hacer click en Conectar. El sistema le mostrará su pantalla principal, compuesta de Cinco pestañas: Alta Ticket Alta Tramite

Más detalles

Árboles. Cursos Propedéuticos 2015. Dr. René Cumplido M. en C. Luis Rodríguez Flores

Árboles. Cursos Propedéuticos 2015. Dr. René Cumplido M. en C. Luis Rodríguez Flores Árboles Cursos Propedéuticos 2015 Dr. René Cumplido M. en C. Luis Rodríguez Flores Contenido de la sección Introducción Árbol genérico Definición y representación Árboles binarios Definición, implementación,

Más detalles

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro USAR MYSQL EN PHP PHP tiene una librería de funciones nativas para conectarse a las base de datos MySQL. Por un lado reconoce la librería mysql y por otro mysqli. Se recomienda el uso de mysqli dado que

Más detalles

Aplicaciones Cliente/Servidor en Gambas Prof: Mileti, P.

Aplicaciones Cliente/Servidor en Gambas Prof: Mileti, P. Aplicaciones Cliente/Servidor en Gambas Prof: Mileti, P. Al igual que un usuario se comunica con el programa por medio del teclado, dos programas se pueden comunicar entre sí por medio Sockets. Se podría

Más detalles

Manual EDT DISEÑO EDT - CREAR EVENTO DE DIVULGACIÓN TECNOLÓGICA

Manual EDT DISEÑO EDT - CREAR EVENTO DE DIVULGACIÓN TECNOLÓGICA Manual EDT DISEÑO EDT - CREAR EVENTO DE DIVULGACIÓN TECNOLÓGICA GESTIONAR EVENTOS DE DIVULGACIÓN TECNOLÓGICA La consulta de EDT es el punto de entrada a la funcionalidad de diseño de EDT. El coordinador

Más detalles

Manual de uso de la plataforma para monitores. CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib

Manual de uso de la plataforma para monitores. CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib Manual de uso de la plataforma para monitores CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib [Manual de uso de la plataforma para monitores] 1. Licencia Autor del documento: Centro de Apoyo Tecnológico

Más detalles

Sistema Tecnológico de Apoyo a la Regulación

Sistema Tecnológico de Apoyo a la Regulación MANUAL USUARIO EMPRESA Páginas: 29 CONTENIDO 1 INTRODUCCION... 3 2 INGRESO AL SISTEMA... 4 2.1 PÁGINA DE INGRESO....4 3 INICIO... 6 4 MENU DE FUNCIONALIDADES... 7 5 GESTIÓN DE PROCESOS... 8 5.1 LISTADO

Más detalles

Prof. Dr. Paul Bustamante

Prof. Dr. Paul Bustamante Carnet Nombre: Examen C++ Grupo A Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Pág.1 Índice 1. INTRODUCCIÓN... 1 2. EJERCICIO 1: AGENDA TELEFÓNICA (4.0 PTOS.)...1 3. EJERCICIO 2:

Más detalles

Redes de área local: Aplicaciones y servicios WINDOWS

Redes de área local: Aplicaciones y servicios WINDOWS Redes de área local: Aplicaciones y servicios WINDOWS 5. Servidor DHCP 1 Índice Definición de Servidor DHCP... 3 Instalación del Servidor DHCP... 5 Configuración del Servidor DHCP... 8 2 Definición de

Más detalles

Control de accesos autónomo por huella dactilar

Control de accesos autónomo por huella dactilar Manual de software Control de accesos autónomo por huella dactilar Access FP (SOFTWARE PARA LECTOR DE HUELLA DACTILAR SIMON ALERT REF.: 8902003-039) (Versión de sofware 1.1) (Versión de documento 1.2)

Más detalles