






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Lab. de Redes, Profesor: , Carrera: Ingeniería Informática, Universidad: UAX
Tipo: Apuntes
1 / 11
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







4.- Los Sockets. 4.1.- Tipos de sockets. 4.2.- El dominio de un socket. 4.3.- Folosofía Cliente-Servidor: el Servidor. 4.4.- El Cliente.
Comparación sockets-pipes.
Ejemplo de comunicación mediante Sockets UNIX ( en la misma máquina ).
Ejemplo de comunicación con sockets INET ( diferentes máquinas ).
descrServer = socket ( dominio, SOCK_STREAM,PROTOCOLO)
descrClient = socket (dominio, SOCK_STREAM,PROTOCOLO)
bind (descrServer, PuntSockServer,longServer)
do {
listen (descrServer, longCola)
descrClient = accept (descrServer,PuntSockClient,longClient)
result = connect (descrClient, PuntSockServer,longserver)
[ close (descrServer) ] } while ( result == -1 )
< DIALOGO > < DIALOGO >
close (descrClient) close (descrClient)
refenciado por descriptores
referenciado por array de descriptores
admite comunicación entre procesos de distintas máquinas
sólo admite comunicación entre procesos de la misma máquina
comunicación bidireccional
comunicación unidireccional
/* acepta la conexion cliente / printf ("\n acepto la conexion \n"); if ( fork() == 0 ) / crea hijo y envia fichero / { escribeFichero ( dfClient ); close ( dfClient ); / cierra el socket / exit ( 0 ); } else close ( dfClient ); / cierra el descriptor cliente / } / en el padre */ }
/******** funcion escribeFichero( df ) ***************/ escribeFichero ( int df ) { static char* linea1 = "esta es la linea 1, "; static char* linea2 = "y esta la linea 2. ";
write ( df, linea1, strlen (linea1) + 1 ); write ( df, linea2, strlen (linea2) + 1 ); }
/****************** fin de servidor.c ***********************/
/************** cliente.c **********************/ /************************************************************/ /********* proceso cliente con sockets AF_UNIX **********/ /************************************************************/
#include <stdio.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h>
#include <sys/un.h> /* para sockets UNIX */
#define PROTOCOLO_DEFECTO 0
main() { int dfClient, longServer, resultado; struct sockaddr_un dirUNIXServer; struct sockaddr* puntSockServer;
puntSockServer = ( struct sockaddr* ) &dirUNIXServer; longServer = sizeof ( dirUNIXServer );
dfClient = socket ( AF_UNIX, SOCK_STREAM, PROTOCOLO_DEFECTO ); /* se crea un socket UNIX, bidireccional */
dirUNIXServer.sun_family = AF_UNIX; /* tipo de dominio server / strcpy ( dirUNIXServer.sun_path, "fichero" ); / nombre server */
do { resultado = connect ( dfClient, puntSockServer, longServer ); if ( resultado == -1 ) sleep (1); /* reintento */ } while ( resultado == -1 );
leeFichero ( dfClient ); /* lee el fichero / close ( dfClient ); / cierra el socket / exit (0); / buen fin */
}
/************* leeFichero ( df ) *****************/
leeFichero ( int df ) { char cad[200]; while ( leeLinea ( df, cad ) ) /* lee hasta fin de la entrada / printf ("%s\n", cad ); / e imprime lo leido */
}
/************* leeLinea ( df, cad ) ******************/ leeLinea ( int df, char cad ) { int n; do { n = read ( df, cad, 1 ); / lectura de un caracter */ } while ( n > 0 && cad++ != NULL ); / lee hasta NULL o fin entrada */
return ( n > 0 ); /* devuelve falso si fin de entrada */
if (inetAddress == 0) break;
bzero ((char *)&serverINETAddress , sizeof(serverINETAddress)); serverINETAddress.sin_family = AF_INET; serverINETAddress.sin_addr.s_addr = inetAddress; serverINETAddress.sin_port = htons ( PUERTO_HORA );
clientFd = socket ( AF_INET, SOCK_STREAM, PROTOCOLO_DEFECTO );
do { result = connect( clientFd, serverSockAddrPtr, serverLen ); if (result == -1) sleep(1); } while (result == -1);
readTime(clientFd); close(clientFd); } exit(0); }
/****************** promptForINETAddress () **************************/ unsigned long promptForINETAddress () { char hostName [100]; unsigned long inetAddress;
do { printf ("Nombre maquina (q = salir, s = maquina propia): "); scanf("%s",hostName); if ( strcmp (hostName,"q") == 0 ) return(0); inetAddress = nameToAddr (hostName); if (inetAddress == 0 ) printf ("\n Maquina no encontrada\n"); } while ( inetAddress == 0 ); }
/******************* nameToAddr ( name ) *************************/ unsigned long nameToAddr (char name) { char hostName[100]; struct hostent hostStruct; struct in_addr* hostNode;
if (isdigit (name[0])) return (inet_addr (name)); if (strcmp (name,"s") == 0) { gethostname (hostName,100);
printf("Nombre de la propia maquina es %s\n",hostName); } else strcpy(hostName,name);
hostStruct = gethostbyname (hostName); if (hostStruct == NULL) return (0); /** maquina no encontrada **/
hostNode = (struct in_addr) hostStruct->h_addr; / saca la dir. IP de la struct / printf("Direccion IP = %s\n", inet_ntoa (hostNode)); return (hostNode->s_addr); /* devuelve la dir IP */ }
/******************** readTime ( fd ) **********************/
readTime (int fd) { char str[200];
printf("La hora en el puerto destino es ");
while (readLine (fd,str)) printf("%s\n",str); }
/************ readLine ( fd, str ) ******************************/ readLine (int fd,char* str) { int n; do { n = read(fd,str,1); } while (n>0 && *str++ != '\n'); return (n>0); }