Parsing en C

4 views
Skip to first unread message

Matias

unread,
Dec 5, 2009, 10:37:49 AM12/5/09
to SEMINARIO DE REDES - TP FINAL
El otro dia en la clase alguien leia caracter por caracter para
parsear las solicitudes del cliente.

Encontré una función muy piola, sscanf, que creo que nos puede ayudar
bastante.

Lo que hice en la prueba fue del lado de server, ponerlo en escucha y
aceptar la conexion cuando el cliente la requeria.

Luego leia carácter por carácter lo que enviaba el cliente (aca si)
hasta encontrar el 3 LF ( enter) ya que independientemente si tenga
user o pass siempre se manda el caracter enter al finalizar la linea.
Esto lo hice para que si el cliente hacia un PUT no leer parte del
archivo que mandaba.

Bueno lo importante es que todo eso que mando se puede parsear
facilmente de esta forma

sscanf(peticion,"%s %s %s\n%s\n%s",cmd, filename, version, user, pass)
donde peticion es una cadena con los caracteres que mando el cliente y
lei uno por uno anteriormente. Lo que hace la funcion es parecida a
fprintf pero al reves.
cmd, filename, version, user y pass son cadenas de caracteres que me
servirian a mi luego para realizar verificacion de errores y para
saber lo que me mando el cliente

Bueno, este es mi humilde aporte, talvez conozcan una manera mas facil
y mas rapida. Si la conocen por favor posteenla porque me volvi
loco !!!

Si algo no entendieron avísenme y pongo mas ejemplos de codigo

Edgardo nicolas Moretti

unread,
Dec 5, 2009, 12:19:45 PM12/5/09
to seminario-de-re...@googlegroups.com
bien ahi..!!

yo lo estaba haciendo asi:


    printf("%s", bufferdatos);

    Peticion = strtok( bufferdatos, "\n" );
    printf("Peticion:%s\n",Peticion);

    if((user1 = strtok( NULL, delimit2 ))==NULL)printf("es NUULL VIEJA\n");
    printf("user:%s\n",user1);
   
    pass1= strtok( NULL, delimit2 );   
    printf("pass:%s\n",pass1);
   
   
    Peticion = strtok( Peticion, delimit1);
    printf("Peticion:%s\n",Peticion);

    //archivo1 = strtok( Peticion, delimit1 );//se come una posicion no deseada

    archivo1 = strtok( NULL, delimit1 );
    printf("archivo:%s\n",archivo1);

    version = strtok( NULL, delimit2 );
    printf("version:%s\n",version);

es lo mismo pero en mas lineas..

saludos.

Edgardo nicolas Moretti

unread,
Dec 5, 2009, 12:30:43 PM12/5/09
to seminario-de-re...@googlegroups.com
El primer Peticion es el buffer donde llega todo lo q manda el cliente

GET arico.tid v1.0\nuser\pass\n\n



ya que estamos una pregunta: cuando recivo caracter por caracter lo que manda el cliente lo puedo ver sin problemas
mientras lo estoy reciviendo pero al terminar el loop, el buffer donde fui guardando los caracteres esta vacio.
¿Le paso a alguien?

Matias

unread,
Dec 5, 2009, 2:32:33 PM12/5/09
to SEMINARIO DE REDES - TP FINAL
Cuando buscaba como parsear una cadena en C encontre el strtok pero
mucha gente no lo recomendaba porque segun ellos modificaba la cadena
deseada.

Con respecto a tu pregunta, no se como lo tendrás implementado vos, yo
seguí el ejemplo que dio Nicolas en clase y le agregue un buffer mas
donde concatenaba los datos que me iban llegando

Cada vez que lees del socket lo guardas en un buffer que es temporal?
Si es asi asegúrate de tener otro contenedor donde poner lo que te va
llegando, podes hacer strcat o yo prefiero hacer sprintf(x,"%s%s",x,y)
que en un lenguaje "mejor" seria hacer x= x+y con strings.

Espero haberte ayudado

On 5 dic, 14:30, Edgardo nicolas Moretti <mone...@gmail.com> wrote:
> El primer Peticion es el buffer donde llega todo lo q manda el cliente
>
> GET arico.tid v1.0\nuser\pass\n\n
>
> ya que estamos una pregunta: cuando recivo caracter por caracter lo que
> manda el cliente lo puedo ver sin problemas
> mientras lo estoy reciviendo pero al terminar el loop, el buffer donde fui
> guardando los caracteres esta vacio.
> ¿Le paso a alguien?
>
> El 5 de diciembre de 2009 14:19, Edgardo nicolas Moretti
> <mone...@gmail.com>escribió:
>
>
>
> > bien ahi..!!
>
> > yo lo estaba haciendo asi:
>
> >     printf("%s", bufferdatos);
>
> >     Peticion = strtok( bufferdatos, "\n" );
> >     printf("Peticion:%s\n",Peticion);
>
> >     if((user1 = strtok( NULL, delimit2 ))==NULL)printf("es NUULL VIEJA\n");
> >     printf("user:%s\n",user1);
>
> >     pass1= strtok( NULL, delimit2 );
> >     printf("pass:%s\n",pass1);
>
> >     Peticion = strtok( Peticion, delimit1);
> >     printf("Peticion:%s\n",Peticion);
>
> >     //archivo1 = strtok( Peticion, delimit1 );//se come una posicion no
> > deseada
>
> >     archivo1 = strtok( NULL, delimit1 );
> >     printf("archivo:%s\n",archivo1);
>
> >     version = strtok( NULL, delimit2 );
> >     printf("version:%s\n",version);
>
> > es lo mismo pero en mas lineas..
>
> > saludos.
>
Message has been deleted

Edgardo nicolas Moretti

unread,
Dec 5, 2009, 3:59:36 PM12/5/09
to seminario-de-re...@googlegroups.com
El error era una pabada...
a mi strtok me anda bien, no me corta nada

saludos

El 5 de diciembre de 2009 16:32, Matias <matia...@hotmail.com> escribió:

Cuando buscaba como parsear una cadena en C encontre el strtok pero
mucha gente no lo recomendaba porque segun ellos modificaba la cadena
deseada.

Con respecto a tu pregunta, cada vez que lees del socket lo guardas en
un buffer que es temporal.



On 5 dic, 14:30, Edgardo nicolas Moretti <mone...@gmail.com> wrote:
> El primer Peticion es el buffer donde llega todo lo q manda el cliente
>
> GET arico.tid v1.0\nuser\pass\n\n
>
> ya que estamos una pregunta: cuando recivo caracter por caracter lo que
> manda el cliente lo puedo ver sin problemas
> mientras lo estoy reciviendo pero al terminar el loop, el buffer donde fui
> guardando los caracteres esta vacio.
> ¿Le paso a alguien?
>
> El 5 de diciembre de 2009 14:19, Edgardo nicolas Moretti
> <mone...@gmail.com>escribió:

>
>
>
> > bien ahi..!!
>
> > yo lo estaba haciendo asi:
>
> >     printf("%s", bufferdatos);
>
> >     Peticion = strtok( bufferdatos, "\n" );
> >     printf("Peticion:%s\n",Peticion);
>
> >     if((user1 = strtok( NULL, delimit2 ))==NULL)printf("es NUULL VIEJA\n");
> >     printf("user:%s\n",user1);
>
> >     pass1= strtok( NULL, delimit2 );
> >     printf("pass:%s\n",pass1);
>
> >     Peticion = strtok( Peticion, delimit1);
> >     printf("Peticion:%s\n",Peticion);
>
> >     //archivo1 = strtok( Peticion, delimit1 );//se come una posicion no
> > deseada
>
> >     archivo1 = strtok( NULL, delimit1 );
> >     printf("archivo:%s\n",archivo1);
>
> >     version = strtok( NULL, delimit2 );
> >     printf("version:%s\n",version);
>
> > es lo mismo pero en mas lineas..
>
> > saludos.
>

Edgardo nicolas Moretti

unread,
Dec 7, 2009, 2:47:52 PM12/7/09
to seminario-de-re...@googlegroups.com
Matias., tenés razón es mucho mas sencillo con tu función!!!

Buenísimo tu humilde aporte!!!!

saludos

Kume66

unread,
Dec 12, 2009, 9:17:02 AM12/12/09
to SEMINARIO DE REDES - TP FINAL
Una pregunta sobre el EOF.
Alguien tiene el problema de que al mandar el EOF, llega otra cosa.

saludos
Reply all
Reply to author
Forward
0 new messages