Omitir navegación.
Inicio

Implementación Servidor Concurrente (C)

Imagen de SebaMinguez

Correspondiente a la clase del 08/09/2000 de Guido Macchi.

Se extiende el código base utilizado en la Implementación comunicación Cliente Servidor (C) para poder atender de manera concurrente a varios clientes.

Se utiliza el mismo cliente anterior, debiéndose ejecutar varias veces para notar el efecto. Vale mencionar que los clientes se deben ejecutar en un periodo breve de tiempo, sin esperar a que el primer clietne termine para comenzar la ejecución del segundo. Para esto bien se pueden usar varias consolas o bien se puede ejecutar con ./cliente & para que la ejecución pase a segundo plano e inmediatamente se pueda ejecutar otra instancia.

ServidorTCP-multi.c

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
 
#define	PORT	5000
 
/* Correspondiente a la clase del 08/09/2009 */
 
typedef struct sockaddr *sad;
 
void error(char *s)
{
	perror(s);
	exit(-1);
}
 
void handler (int sig)
{
	wait(NULL);
}
 
int main ()
{
	int sock, sock1;
	struct sockaddr_in sin,sin1;
	socklen_t l;
	char buff[1024];
	int cto;
 
	signal (SIGCHLD, handler);
 
	if ((sock=socket(PF_INET, SOCK_STREAM, ))<) error("socket");
	sin.sin_family=AF_INET;
	sin.sin_port=htons(PORT);
	sin.sin_addr.s_addr=INADDR_ANY;
 
	if(bind(sock, (sad) &sin, sizeof sin) < ) error("bind");
	if(listen(sock, 5) <  ) error("hola");
 
	for (;;) {
		l= sizeof(sin1);
		if ((sock1=accept(sock, (sad) &sin, &l)) < )
			error("accept");
 
		/* sin el siguiente if, no es multiproceso */
		if (fork() == ) {
			printf("(%s, %d)\n", inet_ntoa(sin.sin_addr),
					ntohs(sin1.sin_port));
			if ((cto=read(sock1, buff, sizeof buff)) < )
				error("read");
 
			buff[cto]=;
			{ int i;
			for (i = ; i < cto; i++ ) 
				buff[i] = toupper(buff[i]);
			}
			sleep(10);
 
			if (write (sock1, buff, cto) < )
				error("write");
			close(sock1);
			exit ();
		}
		close(sock1);
	}
	return ;
}

Trackback URL for "Implementación Servidor Concurrente (C)"

http://www.odiolasllaves.com.ar/trackback/118

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Rafa Soriano

Gracias

Gracias profesor... me sirviò bastante su explicaciòn!.

Imagen de SebaMinguez

Rafa para nada profesor, son

Rafa para nada profesor, son notas de las clases que fui tomando nomas

Imagen de SebaMinguez

Error en el código

Por un comportamiento inesperado en el sistema que colorea el código, se omite el 0 en la comparación del fork(). En realidad debería decir if (fork() == 0).

Si editan el articulo, veran que esta correctamente escrito. Es solo una cuestión de visualización que espero poder corregir pronto. Si alguien conoce de este problema, se agradece una mano.