You are on page 1of 17

Sockets e hilos

Modelos de organización de hilos a) Modelo del servidor trabajador b) Modelo de equipo c) Modelo de entubamiento .

0. "Hilo: error recibiendo datos %d\n". "Hilo: error enviando datos %d\n". exit(-1). errno).h> <stdlib. bytecount.h> <unistd.h> void* SocketHandler(void* lp){ int *csock = (int*)lp. strlen(buffer). fprintf(stderr. TAMBUFER). } #define PROCESOS 10 #define PUERTO 1101 #define TAMBUFER 1024 printf("Hilos: Bytes enviados %d\n". buffer. "Hilos: Eco del servidor: ").h> <string.h> <pthread.Ejemplo: eco con hilos servidor (1/2) #include #include #include #include #include #include #include #include #include #include #include <fcntl. memset(buffer. bytecount).h> <arpa/inet.h> <resolv. } printf("Hilos: Bytes recibidos %d\nCadena recibida: \"%s\"\n". fprintf(stderr. exit(-1). } . return 0.h> <stdio.h> <errno.h> <sys/socket. buffer. if((bytecount = send(*csock. int bytecount. errno). if((bytecount = recv(*csock. 0))== -1){ free(csock). buffer).h> <netinet/in. char buffer[TAMBUFER]. 0))== -1){ free(csock). strcat(buffer. TAMBUFER.

exit(-1). 8).0. if( bind( hsock. pthread_create(&thread_id. sizeof(my_addr)) == -1 ){ fprintf(stderr. *p_int = 1. (void*)csock ). } if(listen( hsock. 0). PROCESOS) == -1 ){ fprintf(stderr. SOCK_STREAM. } else{ fprintf(stderr. struct sockaddr_in my_addr.Ejemplo: eco con hilos servidor (2/2) int main(int argv. my_addr. exit(-1). free(p_int). SOL_SOCKET. memset(&(my_addr. sizeof(int)) == -1 ) ){ printf("Error asignando opciones %d\n". printf("Conexión recibida desde %s\n". } //Esperando conexiones addr_size = sizeof(struct sockaddr_in). &addr_size))!= -1){ printf("---------------------\n").errno). pthread_detach(thread_id). } free(p_int). if( (setsockopt(hsock. pthread_t thread_id=0.sin_addr.sin_port = htons(PUERTO).inet_ntoa(sadr. "Error al aceptar una conexión %d\n".errno). while(1){ printf("Esperando la conexión\n"). int *p_int . (struct sockaddr*)&sadr.sin_zero). close(hsock).sin_family = AF_INET . hsock = socket(AF_INET. errno). 0. int err. int* csock. int hsock."Error ligando el socket %d\n". if(hsock == -1){ printf("Error initializando socket %d\n". errno). "Error escuchando %d\n". socklen_t addr_size = 0. exit(-1). sizeof(int)) == -1 )|| (setsockopt(hsock. csock = (int*)malloc(sizeof(int)). (struct sockaddr*)&my_addr.sin_addr)).s_addr = INADDR_ANY . (char*)p_int. } } } . exit(-1). } p_int = (int*)malloc(sizeof(int)). SO_REUSEADDR. SO_KEEPALIVE.&SocketHandler. errno). sadr. my_addr. char** argc){ my_addr. if((*csock = accept( hsock. SOL_SOCKET. (char*)p_int.

SO_KEEPALIVE. (struct sockaddr*)&my_addr. } } .h> <sys/socket.errno). hsock = socket(AF_INET.s_addr = inet_addr(DIRECCION).0.Ejemplo: eco con hilos cliente(1/2) #include #include #include #include #include #include #include #include #include #include <fcntl. exit(-1). my_addr. int buffer_len=0.h> <arpa/inet. exit(-1). SO_REUSEADDR. } free(p_int). "Error de conexión del socket %d\n". int * p_int.sin_port = htons(PUERTO). (char*)p_int. sizeof(int)) == -1 ) ){ printf("Error configurando opciones %d\n". SOL_SOCKET. errno). int err. sizeof(int)) == -1 )|| (setsockopt(hsock. int hsock. char** argc){ struct sockaddr_in my_addr.h> <unistd. exit(-1). memset(&(my_addr. 0). my_addr. free(p_int). if(hsock == -1){ printf("Error al crear el socket %d\n". 8).h> <stdio.1" #define TAMBUFER 1024 int main(int argv. SOCK_STREAM. (char*)p_int.h> <resolv. *p_int = 1.h> <string.errno).h> <stdlib.0. sizeof(my_addr)) == -1 ){ if((err = errno) != EINPROGRESS){ fprintf(stderr. if( (setsockopt(hsock. } p_int = (int*)malloc(sizeof(int)). my_addr. int bytecount.sin_family = AF_INET .h> #define PUERTO 1101 #define DIRECCION "127.h> <errno. 0.h> <netinet/in. SOL_SOCKET. if( connect( hsock. char buffer[TAMBUFER].sin_addr.sin_zero).

buffer[strlen(buffer)-1]='\0'. } printf("Bytes recibidos %d\n Cadena recibida \"%s\"\n". } . "Error recibiendo datos %d\n". if((bytecount = recv(hsock. 0))== -1){ fprintf(stderr. bytecount). exit(-1). } printf("Envio de %d bytes\n". buffer. strlen(buffer). close(hsock). close(hsock). TAMBUFER. "Error enviando datos %d\n". errno). errno). '\0'. stdin). if( (bytecount=send(hsock.0))== -1){ fprintf(stderr. exit(-1). buffer_len. printf("Tecle algún texto a enviar (presione <enter>)\n"). TAMBUFER). close(hsock). buffer). fgets(buffer.Ejemplo: eco con hilos cliente(2/2) //Dejamos que el cliente envíe y reciba datos memset(buffer. buffer. bytecount.

Ejercicio • Desarrolle un cliente que pueda trabajar con el siguiente servidor: .

listen( ss.h> int main() { int ss. NULL. n = sizeof( struct sockaddr_in ). } } return(0). sizeof( struct sockaddr ) ). &i. pthread_t thread[PROCESOS].h> <sys/wait. } fd = (int)d.h> <arpa/inet.s2. buf. struct sockaddr_in socks[PROCESOS].\n"). SOL_SOCKET.\n"). (struct sockaddr* )&my_addr. SOCK_STREAM. // Limpia la memoria #define PUERTO 12345 #define PROCESOS 10 #define TAMBUFER 1024 //Abrimos el puerto a varios usuarios setsockopt( ss. 0 ).sin_family = AF_INET. } . "%d\n".c #include #include #include #include #include #include #include #include #include #include #include #include <stdio. strlen( buf ) +1 ). i++ ).s1. PROCESOS). while( 1 ) { sprintf( buf. 8 ).h> <sys/socket. fd_set sockfds.n. // Número de puerto memset( &(my_addr. sleep(4). SO_REUSEADDR. int fd. (void *)s1 ). printf("Servidor corriendo . write( fd. pthread_create( &(thread[i++]). struct timeval tv.. my_addr. i=0. ss = socket( PF_INET. void *talker( void *d ) { int i = 0. (struct sockaddr *)&socks[1].sin_port = htons(PUERTO)..h> <signal.. char buf[TAMBUFER].h> <unistd.. talker. struct sockaddr_in my_addr. &n ).h> <pthread. // Familia de protocolos my_addr. sizeof(int) ). '\0'.h> <sys/types. int i=1. while( 1 ) { s1 = accept( ss.servidorsockethilos. //Preparamos el socket para trabajar bind( ss.h> <errno.h> <string.sin_zero).h> <netinet/in.h> <stdlib. printf("Conexión de un cliente.

BufferedReader br = new BufferedReader(new InputStreamReader(cl.out. import java.out.){ linea= br.start(). System.\n"). }//catch }//main } class Manejador extends Thread{ Socket cl.flush(). Manejador m = new Manejador(cl). }//for }catch(Exception e){ e.io. for(. public Manejador(Socket cl){ this. public class SEcoHilos { public static void main(String[] args){ try{ ServerSocket s = new ServerSocket(9000). m. }//catch }//run } . break..*. if(linea.close(). String linea="".").readLine().println("Cliente conectado. } pw.net.println(linea).accept().cl = cl.println("Servidor listo en el puerto"+ s.indexOf("SALIR")>=0){ System.println("Cliente se va. System.. cl.out. pw.getOutputStream())). for(.Ejemplo: eco con hilos servidor java import java.){ Socket cl = s..*.println("Recibiendo mensaje: "+linea). System..getLocalPort()).getInputStream()))..printStackTrace().printStackTrace().out. }//constructor public void run(){ try{ PrintWriter pw = new PrintWriter(new OutputStreamWriter(cl. }//for }catch(IOException io){ io.

").out.exit(0).println("ECO: "+eco). String linea="".. for(.readLine().0.Ejemplo: eco con hilos cliente java import java. }//for }catch(Exception e){ e. if(linea. pw. import java. System.println("Adios.out.out. Socket cl = new Socket(srv.println(linea).printStackTrace().indexOf("SALIR")>=0){ System.getByName("127.getOutputStream())). pw.println("Escribe mensajes <ENTER> para enviar. }//catch }//main } .){ linea= br2.in)).*.readLine().0.getInputStream()))..*..9000). PrintWriter pw = new PrintWriter(new OutputStreamWriter(cl.1"). BufferedReader br2 = new BufferedReader(new InputStreamReader(System. System. public class CEcoHilos { public static void main(String[] args){ try{ InetAddress srv = InetAddress. System.flush().io. <SALIR> para terminar\n").close(). BufferedReader br = new BufferedReader(new InputStreamReader(cl. }//if String eco=br.net. cl.

Práctica 5 SERVIDOR HTTP .

Comunicación .

Por ejemplo en el método POST para llenar un formulario . líneas opcionales separadas de las anteriores por una línea en blanco que permiten enviar datos. POST. Formado por: – Método (GET. conjunto de líneas opcionales que aportan información adicional • El cuerpo de la solicitud. etc) – Dirección URL – Versión (HTTP/1. HEAD. especifica el tipo de documento solicitado.0) • Campos del encabezado de solicitud.Solicitud HTTP • Línea de solicitud.

Windows 95) .0 (compatible.Ejemplo MÉTODO VERSIÓN URL<crlf> ENCABEZADO: Valor<crlf> .kioskea. 15-January2000 14:37:11 GMT User-Agent : Mozilla/4.net HTTP/1. . MSIE 5.0 Accept : Text/html If-Modified-Since : Saturday. .0. ENCABEZADO: Valor<crlf> Línea en blanco <crlf> CUERPO DE LA SOLICITUD GET http://es.

las cuales son: – Linea de estado. especifica versión. el cual contiene .Respuesta HTTP • Es un conjunto de lineas que se envian desde el servidor al navegador. el estado de la solicitud echa y un texto explicativo – Campos de respuesta. campos opcionales que permiten aportar información extra sobre la respuesta o el servidor – Cuerpo de la respuesta.

ENCABEZADO: Valor<crlf> Línea en blanco <crlf> CUERPO DE LA RESPUESTA HTTP/1. .0 Content-Type : text/HTML Content-Length : 1245 Last-Modified : Fri. 15 Jan 2000 14:37:12 GMT Server : Microsoft-IIS/2. . 14 Jan 2000 08:25:13 GMT .0 200 OK Date: Sat.Ejemplo VERSIÓN-HTTP CÓDIGO EXPLICACIÓN <crlf> ENCABEZADO: Valor<crlf> .

HEAD (Ver RFC 2616) .Desarrollo Se implementará un servidor HTTP que sea capaz de reconocer y servir peticiones de recursos mediante los métodos GET. POST.