Вы находитесь на странице: 1из 11

SI.H.SI.E.D.CO.

SINCRONIZACIN DE LA HORA DEL SISTEMA ENTRE DOS COMPUTADORAS


INSTITUTO TECNOLGICO SUPERIOR DE IRAPUATO

Catedrtico: ISC Luis Moiss Burgara Lpez Participantes:

Aguayo Negrete Daniel Fernando lvarez Rivera Leonardo Guevara Cerda Enrique Franco Zaragoza Valeria Iturriaga Salazar Miguel ngel Medina Garca Ftima Estefana Razo Acosta Mara Ftima

IS10110069 IS10110003 IS10110360 IS10110394 IS10110772 IS10110069 IS10110551

Irapuato, Gto. A 24 de Noviembre de 2011

SINCRONIZACION DE LA HORA DEL SISTEMA ENTRE DOS COMPUTADORAS


Introduccin El proyecto que aqu se presenta contiene el proceso mediante el cual un programa ejecutado en una computadora-servidor es capaz de modificar la hora del sistema de otra computadoracliente, adoptando la hora de la computadora-servidor. Problemtica Gran cantidad de instituciones, tales como bancos, empresas de transportes, entre otras, requieren de una aplicacin que al ejecutarse sincronice automticamente la hora del sistema entre todas la computadoras existentes. Esto pudiera resolverse mediante una sincronizacin manual, pero en caso de que por alguna razn se llegara a borrar o a modificar la hora, se tendra que repetir este mtodo manual una y otra vez para modificar la hora del sistema de todos los equipos de cmputo. Justificacin Este proyecto de sincronizacin de la hora del sistema entre dos computadoras, encuentra alguna de sus aplicaciones en el sistema bancario, en los sistemas de transporte (areo, terrestre y martimo), en las instituciones educativas, as como en cualquier empresa donde se requiera tener una hora estndar para todos los equipos de cmputo existentes. Para implementar tal programa en las instituciones antes mencionadas es necesario ampliar algunas funciones del programa para que una computadora sirva como el servidor y las dems como clientes. Objetivo General Crear una aplicacin que al ejecutarse en una computadora-servidor obtenga la hora del sistema de sta y modifique la hora de otra computadora, colocando en sta ltima la hora de la computadora-servidor.

Marco Terico Una forma de conseguir que dos programas se transmitan datos, basada en el protocolo TCP/IP, es la programacin de sockets. Un socket no es ms que un "canal de comunicacin" entre dos programas que corren sobre ordenadores distintos o incluso en el mismo ordenador. Existen bsicamente dos tipos de "canales de comunicacin" o sockets, los orientados a conexin y los no orientados a conexin. En este caso utilizamos los sockets no orientados a conexin. Arquitectura Cliente/Servidor. Servidor es el programa que permanece pasivo a la espera de que alguien solicite conexin con l, normalmente, para pedirle algn dato. Cliente es el programa que solicita la conexin para, normalmente, pedir datos al servidor. Servidor: Apertura de un socket, mediante la funcin socket(). Esta funcin devuelve un descriptor de fichero normal, como puede devolverlo open(). La funcin socket() no hace absolutamente nada, salvo devolvernos y preparar un descriptor de fichero que el sistema posteriormente asociar a una conexin en red. int u_open(int puerto) { SOCKET sock; struct sockaddr_in servidor; WSADATA w; int error = WSAStartup (0x0202, &w); if (error) { printf("\nno se pudo inicialzar el socket"); return FALSE; Avisar al sistema operativo de que hemos abierto un socket y queremos que asocie nuestro programa a dicho socket. Se consigue mediante la funcin bind(). El sistema todava no atender a las conexiones de clientes, simplemente anota que cuando empiece a hacerlo, tendr que avisarnos a nosotros. Es en esta llamada cuando se debe indicar el nmero de servicio al que se quiere atender. if((bind(sock,(struct sockaddr *)&servidor,sizeof(servidor))<0) || (listen(sock,MAXBACKLOG)<0)) return -1; return sock; }

Avisar al sistema de que comience a atender dicha conexin de red. Se consigue mediante la funcin listen(). A partir de este momento el sistema operativo anotar la conexin de cualquier cliente para pasrnosla cuando se lo pidamos. Si llegan clientes ms rpido de lo que somos capaces de atenderlos, el sistema operativo hace una "cola" con ellos y nos los ir pasando segn vayamos pidindolo. int u_listen(int fd,char * hostn){ struct sockaddr_in clientered; int len =sizeof(struct sockaddr); int retval; struct hostent * hostptr;

Pedir y aceptar las conexiones de clientes al sistema operativo. Para ello hacemos una llamada a la funcin accept(). Esta funcin le indica al sistema operativo que nos d al siguiente cliente de la cola. Si no hay clientes se quedar bloqueada hasta que algn cliente se conecte. Escribir y recibir datos del cliente, por medio de las funciones write() y read(), que son exactamente las mismas que usamos para escribir o leer de un fichero. Obviamente, tanto cliente como servidor deben saber qu datos esperan recibir, qu datos deben enviar y en qu formato. void LeerDatos() { int cc; char buf[1024]; do{ cc=recv(s,buf,sizeof(buf), 0); // separar(buf); if (cc == 0) exit (0); if(cc>0){ printf("\nfecha recibida: %s \n", buf); memset( buf, 0, sizeof( buf ) ); } Cierre de la comunicacin y del socket, por medio de la funcin close(), que es la misma que sirve para cerrar un fichero. closesocket(s); break; }

Cliente.

Apertura de un socket, como el servidor, por medio de la funcin socket(). SOCKET s; s = u_connect(puerto,hostn); Solicitar conexin con el servidor por medio de la funcin connect(). Dicha funcin quedar bloqueada hasta que el servidor acepte nuestra conexin o bien si no hay servidor en el sitio indicado, saldr dando un error. En esta llamada se debe facilitar la direccin IP del servidor y el nmero de servicio que se desea. int u_connect(int puerto,char * hostn){ struct sockaddr_in servidor; struct hostent *hp; SOCKET sock; int retval; WSADATA w; int error = WSAStartup (0x0202, &w); if (error) { printf("\nno se pudo inicialzar el socket"); return FALSE; }

Escribir y recibir datos del servidor por medio de las funciones write() y read(). void LeerDatos() { int cc; char buf[1024]; do{ cc=recv(s,buf,sizeof(buf), 0); // separar(buf); if (cc == 0) exit (0); if(cc>0){ printf("\nfecha recibida: %s \n", buf); memset( buf, 0, sizeof( buf ) );

Cerrar la comunicacin por medio de close(). printf("\n esta desconectado\n"); closesocket(s); break; } Apertura de un punto terminal en un canal (Socket) La llamada para abrir un canal bidireccional de comunicaciones es socket y se declara como sigue: int socket(int af,int type,int protocol); Socket crea un punto terminal para conectarse a un canal y devuelve un descriptor. El descriptor del conector devuelto se usar en llamadas posteriores a funciones de interfaz. Af (address family) especifica la familia de conectores o familia de direcciones que se desea emplear. if((sock= socket(AF_INET,SOCK_STREAM,0))<0) return -1; El argumento type indica la semntica de la comunicacin para el conector. Puede ser:

SOCK_STREAM: Conector con un protocolo orientado a conexin. SOCK_DGRAM: Conector con un protocolo no orientado a conexin.

Protocol especifica el protocolo particular que se va a usar con el conector. Normalmente, cada tipo de conector tiene asociado slo un protocolo, pero si hubiera ms de uno, se especificara mediante este argumento. Protocol puede valer 0, en cuyo caso la eleccin del protocolo se deja en manos del sistema.

Hilos. Un mtodo para lograr el paralelismo consiste en hacer que varios procesos cooperen y se sincronicen mediante memoria compartida. Una alternativa es el empleo de mltiples hilos de ejecucin en un solo espacio de direcciones. El empleo de hilos mltiples puede simplificar la programacin de problemas como la vigilancia y procesamiento de entradas de descriptores de archivo mltiples porque un hilo dedicado puede vigilar cada descriptor. Adems, los hilos ofrecen la posibilidad de traslapar E/S (escrutinio simple), y procesamiento, cosa que no es posible con los otros enfoques. HANDLE tPrimary,tSecond,ttercero,tcuarto; La mayor parte de las funciones de hilos devuelven 0 si tuvieron xito y un cdigo de error distinto de 0 si no fuera as. La funcin pthread_create (thr_create) crea un hilo para ejecutar una funcin especifica; pthread_exit (thr_exit) hace que el hilo invocador termine sin causar que todo el proceso llegue a su fin. La funcin pthread_kill (thr_kill) envia una seal a un hilo especificado. pthread_join(thr_join) hace que le hilo invocador espere a que termine el hilo especificado. Esta llamada es similar a waitpid en el nivel de procesos. Por ltimo, pthread_self (thr_self) devuelve la identidad del invocador. El resto de las llamadas tienen que ver con mecanismos de sincronizacin. ttercero = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)EnviarDatos, NULL, CREATE_SUSPENDED, &ThreadID); tcuarto = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)cambiardatos, NULL, CREATE_SUSPENDED, &ThreadID); Un hilo tiene un identificador (ID), una pila, una prioridad de ejecucin y una direccin de inicio de la ejecucin. Un hilo puede averiguar su ID llamando a pthread_self. La estructura de datos interna del hilo tambin puede contener informacin de programacin y uso. DWORD ThreadID;

Funcin SetSystemTime Pone el tiempo de sistema corriente y la fecha. El tiempo de sistema es expresado en el Tiempo Coordinado Universal (UTC). SYSTEMTIME t; t.wYear = nyear; t.wMonth = nmes; Parmetros: lpSystemTime [en] Un indicador de una estructura de SYSTEMTIME que contiene la nueva fecha de sistema y el tiempo. Valor de vuelta: Si la funcin tiene xito, el valor de vuelta es no nulo. Si los suspensos de funcin, el valor de vuelta es el cero. Para conseguir la informacin de error ampliada, llame GetLastError. El proceso de llamada debe tener el privilegio de SE_SYSTEMTIME_NAME. Este privilegio es incapacitado por omisin. La funcin de SetSystemTime permite el privilegio de SE_SYSTEMTIME_NAME antes del cambio del tiempo de sistema e incapacita el privilegio antes del devolver. t.wMinute = nminutos; t.wSecond = nsec; //t.wMilliseconds = 0; :: SetSystemTime (&t);

Funcin Strftime time ( &rawtime ); timeinfo = localtime ( &rawtime ); strftime (buffer,1024,"%d/%m/%Y %H:%M:%S %p",timeinfo);

Formato C cuerda que contiene cualquier combinacin de carcteres regulares y formato especial specifiers. Este formato specifiers es substituido por la funcin a los valores correspondientes para representar el tiempo especificado en timeptr. Ellos todos comienzan con un porcentaje (el %) el signo, y son: Especificador %a %A %b %B %c %x %X %Y %y Descripcin Nombre abreviado del da * Nombre del da * Nombre abreviado del mes* Nombre del mes* Representacin de la fecha y del tiempo* Presentacin de la fecha* Presentacin del tiempo* Representacin del ao Representacin del ao abreviado Ejemplo Thu Thursday Jun June
Thu Aug 23 14:55:02 2001 02/12/92 11:50:02 2001 01

* El espicificador cuya descripcin es marcada con un asterisco (*) es dependiente de lugar. timeptr El indicador de una estructura de tm que contiene un tiempo calendario estropeado en sus componentes (ve la tm).

Resultados

Los resultados del proyecto fueron satisfactorios ya que, se ah logrado modificar la hora y fecha de nuestro sistemas, asi como tambin obtenerla y presentarla en un reloj grafico.

Conclusin

Bibliografa:

"UNIX, Programacin avanzada" de Fco. Manuel Mrquez Garca, editorial ra-ma. http://www.chuidiang.com/clinux/sockets/sockets_simp.php#sockets http://www.cplusplus.com/reference/clibrary/ctime/strftime/

Вам также может понравиться