/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Como saber cuando recv() deja de recibir datos

 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
fridex



Registrado: 02 Dic 2008
Mensajes: 9

MensajePublicado: 14/12/2008 1:58 am
Título: Como saber cuando recv() deja de recibir datos

Hola, estoy haciendo un programa cliente, y quiero saber como hacer para saber cuando el servidor deja de mandar datos a mi cliente mediante la funcion recv(). Por que puedo hacer un while infinito, pero la idea es saber cuando el servidor dejo de mandarme datos para asi procesarlos.
Espero que se entienda lo que quiero, sino, no duden en preguntar.

Muchas gracias
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2558
Ubicación: Valladolid (España)

MensajePublicado: 14/12/2008 3:18 am
Título:

La función recv es bloqueante mientras no reciba un solo byte del conector. En caso de hacerla no bloqueante mediante la funcion fcntl esta retorna (en caso de no recibir datos) -1.






*EOF*
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
fridex



Registrado: 02 Dic 2008
Mensajes: 9

MensajePublicado: 22/12/2008 1:55 am
Título:

muchas gracias cheroky. Encotre un codigo;

Código:
/* Call select() */
do {
FD_ZERO(&readset);
FD_SET(socket_fd, &readset);
result = select(socket_fd + 1, &readset, NULL, NULL, NULL);
} while (result == -1 && errno == EINTR);

if (result > 0) {
if (FD_ISSET(socket_fd, &readset)) {
/* The socket_fd has data available to be read */
result = recv(socket_fd, some_buffer, some_length, 0);
if (result == 0) {
/* This means the other side closed the socket */
close(socket_fd);
}
else {
/* I leave this part to your own implementation */
}
}
}
else if (result < 0) {
/* An error ocurred, just print it to stdout */
printf("Error on select(): %s\", strerror(errno));
}


parece que funciona. Aunque no encuenro la diferencia entre usar esto y un;

Código:
if(recv(new_fd, recvbuff, 128, 0))


no se si tiene alguna ventaja.
Saludos
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2558
Ubicación: Valladolid (España)

MensajePublicado: 22/12/2008 4:14 pm
Título:

La única diferencia es el numero de bytes máximo que se debe de leer del conector, dado por lo que se supone es una variable, por tanto ese valor (el del código, no el fragmento) puede ser dinámico (runtime set value).

En cuanto a como se evalúa: si el valor de retorno es 0 el socket no es valido, con -1 te remito a mi anterior post. No obstante la funcion recv no es que este precisamente [poco documentada].

*EOF*
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
_Leo_



Registrado: 20 Oct 2005
Mensajes: 399
Ubicación: Buenos Aires, Argentina

MensajePublicado: 23/01/2009 9:27 am
Título:

En realidad no hay forma de saber en un extremo si el otro dejó de enviar datos. Es como el cuento de la paloma mensajera en la guerra.

Dos puestos de control se comunicaban mediante una paloma mensajera. En el camino de la paloma estaba el campo de batalla y cuando desde el puesto A la enviaban no tenían forma de saber si la paloma había muerto en el camino. Y más aún, no podían saber si había muerto antes de llegar o había muerto durante el camino de vuelta. Y como si todo esto fuese poco, no podrían saber si la paloma estaba viva y tan solo se había demorado un poco en su vuelo y estaba a punto de llegar de vuelta.

Ahora me gustaría que me digas cómo podrías desde un extremo saber si desde el otro dejaron de enviar datos.

... Cool

Los sockets TCP resuelven en parte el problema. Pero no del todo. El socket TCP te garantiza que si los datos enviados no llegan, te dará un error. Pero no tiene forma de adivinar si el otro extremo está enviando datos en este momento. Ese trabajo es tuyo.

Cuando usás TCP tenés que definir un protocolo propio que defina la forma de saber cuando se termina la comunicación.

Defino un protocolo imaginario:

Cada mensaje contiene dos bytes.
El primer bytes sólo puede ser 0 o 1 y el segundo es el dato enviado.
Todos los mensajes salen con el primer byte en 1 salvo el último que lo lleva en cero. Cuando el receptor obtiene un par de bytes donde el primero es cero, puede cerrar la conexión.
_________________
_Leo_
Daphne - administrador de tareas
Cine, tecnología, sociedad
Volver arriba
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com