| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
gancedin
Registrado: 08 Ene 2010 Mensajes: 12
| Publicado: 19/12/2010 5:21 am | | | Título: servidor tcp |
| 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. |
| | Volver arriba | |  | gancedin
Registrado: 08 Ene 2010 Mensajes: 12
| Publicado: 04/01/2011 1:37 am | | | Título: |
| 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: |
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: |
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 |
| | Volver arriba | |  | polly
Registrado: 19 Jul 2007 Mensajes: 618
| Publicado: 04/01/2011 5:17 am | | | Título: |
| ¿Por qué supones que tienen fallos ? ¿No te compila ? Si es asi, qué errores te da el compilador ?
S2 |
| | Volver arriba | |  | | gancedin
Registrado: 08 Ene 2010 Mensajes: 12
| Publicado: 04/01/2011 2:56 pm | | | Título: |
| 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. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7517 Ubicación: Mexico
| Publicado: 05/01/2011 9:18 am | | | Título: |
| ¿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 |
| | Volver arriba | |  | gancedin
Registrado: 08 Ene 2010 Mensajes: 12
| Publicado: 07/01/2011 6:27 am | | | Título: |
| 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: | 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: | 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 |
| | Volver arriba | |  | | gancedin
Registrado: 08 Ene 2010 Mensajes: 12
| Publicado: 07/01/2011 7:52 am | | | Título: |
| 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: | 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; }
|
|
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7517 Ubicación: Mexico
| Publicado: 07/01/2011 8:34 am | | | Título: |
| 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: | Si no hay datos o error: ... Si el caracter NO es '\n' ... Si el caracter NO es '\r' ... |
Cuando deberia ser:
| Código: | 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: | 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 |
| | Volver arriba | |  | gancedin
Registrado: 08 Ene 2010 Mensajes: 12
| Publicado: 07/01/2011 8:51 am | | | Título: |
| 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 |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |