es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El servidor de sockets se desconecta mientras el cliente se ha desconectado.

Pregunta

Estoy practicando el lenguaje C y la programación de sockets.

El código del servidor se bloquea cuando verifica los clientes activos y un cliente se ha desconectado (por ejemplo, la conexión se ha cerrado). No tengo experiencia leyendo un volcado de GDB. ¿Alguien puede indicarme lo que me falta aquí?

Este es el código del servidor. El cliente se conecta y se desconecta. El servidor verifica si hay un cliente desconectado enviando un pequeño mensaje y esperando una respuesta. Después de recibir un error de “piping roto” (“broken pipe”), el código se bloquea.

c
void * client_hartbeat()
{
int ret = 0, i;
char send_msg[50] = "e";
char recv_msg[50];
while(1)
{
sleep(3);
printf("\ncomprobando los clientes desconectados\n");
memset(&recv_msg,0,sizeof(recv_msg));
for(i=0;i<CLIENTS;i++){
if(client_pool[i]!=0){
printf("PRUEBA0, socket: %i thread: %i\n", client_pool[i],pthread_self());
if(send(client_pool[i],send_msg,sizeof(send_msg),0) < 0){
printf("error al enviar: %s\n", strerror(errno));
}else if(recv(client_pool[i],recv_msg,sizeof(recv_msg),0) < 0){
printf("error al recibir: %s\n", strerror(errno));
}
printf("PRUEBA1, socket: %i thread: %d\n", client_pool[i],pthread_self());
}
}
}
printf("PRUEBA1\n");
pthread_exit(&th2);
}

A continuación, se muestra el volcado de GDB:

[Thread debugging using libthread<em>db enabled]
Using host libthread</em>db library "/lib/x86<em>64-linux-gnu/libthread</em>db.so.1".
esperando conexiones...
[New Thread 0x7ffff7dba640 (LWP 22567)]
[New Thread 0x7ffff75b9640 (LWP 22568)]

comprobando los clientes desconectados

comprobando los clientes desconectados
PRUEBA0, socket: 4 thread: -144992704
PRUEBA1, socket: 4 thread: -144992704

comprobando los clientes desconectados
PRUEBA0, socket: 4 thread: -144992704
PRUEBA1, socket: 4 thread: -144992704

comprobando los clientes desconectados
PRUEBA0, socket: 4 thread: -144992704

El subproceso 3 "a.out" recibió la señal SIGPIPE, Pipe roto.
[Cambiando al subproceso 0x7ffff75b9640 (LWP 22568)]
<em>_libc</em>send (flags=<optimized out>, len=50, buf=0x7ffff75b8e10, fd=4) at ../sysdeps/unix/sysv/linux/send.c:28
28      ../sysdeps/unix/sysv/linux/send.c: No such file or directory.
(gdb)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el código del servidor se está bloqueando al intentar enviar un mensaje a un cliente que ya se desconectó. El volcado de GDB muestra que la función send() está devolviendo un código de error, lo que está causando el bloqueo. Para solucionar esto, deberías agregar código de manejo de errores al código del servidor para comprobar errores al enviar mensajes a los clientes. Si se encuentra un error, el servidor debería eliminar al cliente de la lista de clientes conectados y continuar.

Comments are closed.