Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Leer de un socket

Estas en el tema de Leer de un socket en el foro de C/C++ en Foros del Web. Holas. Estoy realizando una aplicacion cliente-servidor donde yo soy unicamente cliente y tengo la informacion necesaria para conectar con el servidor. Imaginemos que el servidor ...
  #1 (permalink)  
Antiguo 28/11/2009, 07:17
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años
Puntos: 0
De acuerdo Leer de un socket

Holas.

Estoy realizando una aplicacion cliente-servidor donde yo soy unicamente cliente y tengo la informacion necesaria para conectar con el servidor.

Imaginemos que el servidor me envia un mensaje de 10 bytes (1 caracter, 1 byte). Como se que ocupa 10 bytes es tan facil como hacer:

Código:
nBytes = read (fd_socket, buffer, 10);
Dentro del buffer se guardaran los 10 caracteres.


Ahora bien, y si la longitud del mensaje nos la indican dentro del propio mensaje? Por ejemplo, el primer byte indica la longitud del mensaje (sin contar el primer byte). Supongamos que un int ocupa 1 byte. Entonces lo que yo haria seria lo siguiente (sin controlar los errores):

Código:
int num;
nBytes = read (fd_socket, buffer, 1); //Leo primer byte
num = atoi (buffer);
nBytes = read (fd_socket, buffer, num); //Leo los demas bytes
Mi problema es que el primer read lo hace bien. Pero cuando hago el segundo se me bloquea el programa porque esta esperando mas mensajes del servidor. Es como si leyera el priemr byte y luego borrara los bytes que quedan por leer.

Tenia entendido que el read es como una cola y no se perdian los demas caracteres.


Algun comentario?


Gracias.
  #2 (permalink)  
Antiguo 30/11/2009, 05:15
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Leer de un socket

¿Que valor tiene num? ¿Seguro que hay datos suficientes esperando? Un byte no es un int, es un char.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 30/11/2009, 15:58
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años
Puntos: 0
Respuesta: Leer de un socket

Quizas el problema esta ahi. Como se lee un int con la funcion read? Lo unico que se me ocurre es hacer un cast de los caracteres leidos, pero lo ideal seria guardar los bytes directamente en un buffer de int, ya que el buffer del read es void*.

Última edición por GagleKas; 30/11/2009 a las 16:19
  #4 (permalink)  
Antiguo 30/11/2009, 18:21
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Leer de un socket

Algo asi:
Código:
int num;
nBytes = read (fd_socket, (void*)&num, sizeof(num))
Por otro lado tal vez quieras usar recv en lugar de read.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 01/12/2009, 00:56
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años
Puntos: 0
Respuesta: Leer de un socket

Perfecto, gracias. He leido por encima la especificacion de la funcion recv y parece ser que es lo que busco. Tan solo tengo que ponerle un 0 en el flag para que funcione como una "cola".

Última edición por GagleKas; 01/12/2009 a las 05:14
  #6 (permalink)  
Antiguo 01/12/2009, 01:11
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Leer de un socket

De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 02/12/2009, 04:14
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años
Puntos: 0
De acuerdo Respuesta: Leer de un socket

Solo un comentario antes de dar por solucionado el tema. No hace falta hacerle un cast (void*). Si tu tienes un buffer de unsigned short int (16bits, rango 0-65535) tan solo tienes que usar la siguiente funcion para que te lo guarde correctamente:

Código:
unsigned short int buffer;

recv (fdSocket, &buffer, 2, 0);
Nada mas. Con esto se leeran correctamente los 16 bits del unsigned short int.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:25.