servidor tcp

Temas relacionados con la programación de aplicaciones que funcionan sobre un servidor.
Responder
Mensaje
Autor
gancedin
Mensajes: 12
Registrado: 08/01/2010 4:29 am

servidor tcp

#1 Mensaje por gancedin » 19/12/2010 5:21 am

Hola a todos,

¿alguien podría ayudarme diseñar dos funciones para incluir dentro de un servidor TCP?, de las cuales:

-una de ellas haga eco de lo que envía el cliente.

-otra devuelva ese mismo eco, pero entre paréntesis, teniendo en cuenta que el paréntesis tiene que aparecer inmediatamente después del texto enviado, es decir, teniendo en cuenta la introducción de \n y \r.

muchas gracias.

gancedin
Mensajes: 12
Registrado: 08/01/2010 4:29 am

#2 Mensaje por gancedin » 04/01/2011 1:37 am

Hola, necesitaría saber que fallos de programación tienen estas dos funciones:

Esta primera, integrada en un servidor, lee lo que recibe del cliente y lo devuelve (el prototipo tiene que ser como se muestra).

Código: Seleccionar todo


int recibe_linea(int sock, char *buff, int max)
{
int retornos=0;
int leemos;
int i;
	for(i=0; i<max; i++)
	{
		leemos=read(sock, &buff[i], sizeof(buff));
		if(buff[i]==('\n'))
		{
			retornos++;
			break;
		}
		if(buff[i]=!('\r')) 
		{
			retornos++; 
			i++;
		}
		else if((leemos==-1) || (leemos==0)) 
			return retornos;
	}
	return retornos;
}


La segunda, recoge la cadena de la anterior, y la devuelve entre paréntesis, teniendo en cuenta los retornos de carro y los saltos de línea.

Código: Seleccionar todo


void procesa_linea(char *texto, char *resultado)
{
	resultado[0]='(';
	int j;
	int k;
	
	do
	{
		if(texto[j]!= ('\n'))
			
			resultado[k]=texto[j];
			k++;
				
			
		
	}
	while(j<strlen(texto));	
	resultado[j]=')';
	resultado[j+1]='\n';
	resultado[j+2]=0;

}

Gracias de antemano

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#3 Mensaje por polly » 04/01/2011 5:17 am

¿Por qué supones que tienen fallos ? ¿No te compila ? Si es asi, qué errores te da el compilador ?

S2

gancedin
Mensajes: 12
Registrado: 08/01/2010 4:29 am

#4 Mensaje por gancedin » 04/01/2011 2:56 pm

No hay errores de compilación, pero si de funcionamiento.

Verás, estas funciones van en un servidor tcp, al cual me conecto por telnet, y la conexión parece correcta, pero el servidor no recibe datos, ni devuelve nada, además hago comprobación de errores en la conexión.

Saludos.

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#5 Mensaje por rir3760 » 05/01/2011 9:18 am

¿Es un ejercicio de clase?

Las dos funciones tienen varios errores.

En la funcion "recibe_linea" si vas a leer un caracter debes utilizar "sizeof(char)" o mejor 1. Los sentencias de seleccion "if" estan mal estructuradas ya que los casos deberian ser exclusivos (el caracter puede ser '\r' o '\n' pero no ambos). El ultimo if donde verificas el valor de retorno de la funcion deberia ser el primero.

En la segunda funcion "procesa_linea" la linea solo sera correcta si para empezar el bloque indicado por "resultado" esta lleno de ceros (ya que no agregas el '\0' al final de esa cadena). El error mas importante es que tienes un bucle con dos contadores "j" y "k", ambos sin darles un valor inicial y sin incrementar el primero dentro del bucle.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

gancedin
Mensajes: 12
Registrado: 08/01/2010 4:29 am

#6 Mensaje por gancedin » 07/01/2011 6:27 am

He hecho algunas modificaciones, y la cosa va mejorando, pero aún no hace lo que quiero, de momento me muestra cada caracter, pero en lineas diferentes, no como una frase, y al final los paréntesis solos ()

Código: Seleccionar todo

int recibe_linea(int sock, char *buff, int max)
{
int recibimos;
int devolvemos=0;
int i;
	for(i=0; i<=max; i++)
	{
		recibimos=read(sock, &buff[i], sizeof(char));
		//vamos leyendo caracter a caracter y almacenándolos en buff
		//si lo que recibimos es -1 o 0, directamente devolvemos
		if((recibimos==-1) || (recibimos==0)) 
			return devolvemos;
		//en caso contrario comparamos con el salto de línea o el retorno de carro
		else 
		{
			if(buff[i]!=('\n'))
			{
				devolvemos++;
				return devolvemos;
				break;
			}
			
			if(buff[i]!=('\r')) 
			{
				devolvemos++; 
				i++;
			}
			
			
		}
	}
	return devolvemos;
}

Código: Seleccionar todo

void procesa_linea(char *texto, char *resultado)
{
	resultado[0]='(';
	int j=0;
	int k=1;
	
	do
	{
		if(texto[j]!= ('\n'))
		{
			resultado[k]=texto[j];
			j++;
			k++;
			
		}
		else 
			break;
		
	}
	while(j<strlen(texto));	
	
	resultado[j]=')';
	resultado[j+1]='\n';
	resultado[j+2]=0;
}
saludos

gancedin
Mensajes: 12
Registrado: 08/01/2010 4:29 am

#7 Mensaje por gancedin » 07/01/2011 7:52 am

Solucioné el problema que tenía la función procesa_linea(), pues la variable j es la que recorre la cadena "texto" mientras que la que recorre "resultado" es k.

Ahora el problema está en recibe_linea(). Por el momento, el resultado que obtengo del servidor es este:

c (c)
a (a)
d (d)
e (e)
n (n)
a (a)

en lugar de este:

cadena
(cadena)

codigo actual:

Código: Seleccionar todo

int recibe_linea(int sock, char *buff, int max)
{
int recibimos;
int devolvemos=0;
int i;
	for(i=0; i<=max; i++)
	{
		recibimos=read(sock, &buff[i], 1);
		//vamos leyendo caracter a caracter y almacenándolos en buff
		//si lo que recibimos es -1 o 0, directamente devolvemos
		if((recibimos==-1) || (recibimos==0)) 
			return devolvemos;
		//en caso contrario comparamos con el salto de línea o el retorno de carro
		else 
		{
			if(buff[i]!=('\n'))
			{
				devolvemos++;
				break;
			}
			
			if(buff[i]!=('\r')) 
			{
				devolvemos++; 
			}
			
			
		}
	}
	return devolvemos;
}

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#8 Mensaje por rir3760 » 07/01/2011 8:34 am

Como ya te habia comentado el error principal en esa funcion se debe a como estan estructuradas las sentencias de seleccion. Tambien deberias leer un buen libro o seguir un curso ya que son errores basicos.

En seudo codigo el bloque de seleccion en la funcion tal como esta es:

Código: Seleccionar todo

Si no hay datos o error:
   ...
Si el caracter NO es '\n'
   ...
Si el caracter NO es '\r'
   ...
Cuando deberia ser:

Código: Seleccionar todo

Si no hay datos o error
   Terminamos el bucle
Caso contrario: Si el caracter es '\n'
   Fin de linea, terminamos el bucle
Caso contrario: Si el caracter es '\r'
   Ignoramos el caracter
Caso contrario:
   Cualquier otro caracter, se agrega
Corro el riesgo de pasar con eso como un [CENSORED] pero, de nuevo, eso te ahorrara muchos dolores de cabeza.

La funcion corregida:

Código: Seleccionar todo

int recibe_linea(int sock, char *buff, int max)
{
   int i;
   int rv;
   
   i = 0;
   while (i < max){
      rv = read(sock, &buff[i], 1);
      
      if (rv == -1 || rv == 0 || buff[i] == '\n')
         break;
      else if (buff[i] != '\r')
         i++;
   }
   
   return i;
}
Solo hay que tener cuidado con el contenido de "buff" ya que no se tiene la garantia de ser una cadena (y por ende terminar en '\0'), en otras palabras debe imprimirse manualmente en base a su numero de caracteres (ese es el valor de retorno de la funcion).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

gancedin
Mensajes: 12
Registrado: 08/01/2010 4:29 am

#9 Mensaje por gancedin » 07/01/2011 8:51 am

Lo que me comentas ya lo estoy verificando yo en el main(), creo que ahora funciona correctamente.

Muchísimas gracias por tu ayuda, me ha servido mucho.

Un saludo

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado