C/Visual C - Ayuda: lectura formateada desde un socket

 
Vista:

Ayuda: lectura formateada desde un socket

Publicado por Charlie (2 intervenciones) el 13/02/2005 01:43:41
Hola, estoy tratando de implementar un pequeño cliente de POP3 en C para Unix empleando sockets.

Quisiera saber si alguien conoce alguna manera de leer de un socket sin que sea carácter a carácter. Concretamente, en POP3 los datos se envían linea por linea (con un "\r\n" como separador de cada linea), con un largo máximo de línea de 512 bytes .

Había pensado que se podría usar alguna función del tipo fgets para leer una linea en un buffer de 512 bytes, pero fgets solo lee de ficheros (*FILE), y en Unix los sockets son int.

¿Alguien puede ayudarme? Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda: lectura formateada desde un socket

Publicado por chuidiang (677 intervenciones) el 13/02/2005 22:23:35
Hola:

Normalmente para leer de un socket se suelen leer un montón de bytes seguidos, cuantos más mejor.

La funcion read() o recv() que se utilizan para los sockets, leen los bytes disponibles y devuelven el control, no esperan a leer todos los que les has dicho.

Por ejemplo, si desde el otro lado te envian una cadena de 10 caracters, tu puedes poner perfectamente

char buffer[1024];
int numero_caracteres_leidos
numero_caracteres_leidos = read (socket, buffer, 1024);

y en buffer tendrás la cadena.

Eso sí, debes siempre revisas lo que lees. Es posible que si hay dos cadenas disponibles, read() te devuelva las dos cadenas en buffer. Tendrás que buscar el \r\n para separarlas.

Otra opción (no sé si funciona) es usar la función fdopen(). A esta función le pasas un int descriptor de fichero y te devuelve un FILE *

Se bueno.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda: lectura formateada desde un socket

Publicado por Charlie (2 intervenciones) el 14/02/2005 00:24:49
Hola,

Ya se que puedo leer del socket cargando en un buffer hasta que se llene y luego ir mirando, pero en este caso concreto me interesa mucho no truncar ninguna linea que envíe el servidor (ya que tendría que gestionar la deteccion del truncamiento y la posterior carga del trozo de linea restante).

Encontré como dices la función fdopen, que devuelve un stream asociado a un descriptor de fichero, y por el momento parece que funciona. Únicamente tengo que hacer un fgets sobre el FILE* devuelto y almacenarlo en un array de 512 caracteres para tratarlo, lo cual me ahorra todo ese tratamiento extra ;).

Muchas gracias por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar