Programación General > C++ Builder

 Ahorcado cliente servidor TCP

(1/1)

antlcn:
Hola, estoy trabajando en el juego del ahorcado donde existe un servidor al que pueden conectarse varios clientes y jugar partidas individuales simultaneas gracias a la funcion select(). El caso es que al compilar "servidor.c" todo va bien pero lo ejecuto y me devuelve el siguiente error:


*** glibc detected *** ./servidor: corrupted double-linked list: 0x09310168 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c0c1)[0x17c0c1]
/lib/libc.so.6(+0x6d9f3)[0x17d9f3]
/lib/libc.so.6(cfree+0x6d)[0x180a1d]
/lib/libc.so.6(fclose+0x14a)[0x16c3da]
./servidor[0x8048ad2]
./servidor[0x80492d0]
/lib/libc.so.6(__libc_start_main+0xe7)[0x126ce7]
./servidor[0x8048931]
======= Memory map: ========
00110000-00267000 r-xp 00000000 07:00 21126      /lib/libc-2.12.1.so
00267000-00269000 r--p 00157000 07:00 21126      /lib/libc-2.12.1.so
00269000-0026a000 rw-p 00159000 07:00 21126      /lib/libc-2.12.1.so
0026a000-0026d000 rw-p 00000000 00:00 0
00381000-0039b000 r-xp 00000000 07:00 95         /lib/libgcc_s.so.1
0039b000-0039c000 r--p 00019000 07:00 95         /lib/libgcc_s.so.1
0039c000-0039d000 rw-p 0001a000 07:00 95         /lib/libgcc_s.so.1
003e8000-003e9000 r-xp 00000000 00:00 0          [vdso]
0081c000-00838000 r-xp 00000000 07:00 21110      /lib/ld-2.12.1.so
00838000-00839000 r--p 0001b000 07:00 21110      /lib/ld-2.12.1.so
00839000-0083a000 rw-p 0001c000 07:00 21110      /lib/ld-2.12.1.so
08048000-0804b000 r-xp 00000000 08:05 5213       /"RUTA FICHERO"/
0804b000-0804c000 r--p 00002000 08:05 5213        /"RUTA FICHERO"/
0804c000-0804d000 rw-p 00003000 08:05 5213        /"RUTA FICHERO"/
09310000-09331000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0
b7621000-b7700000 ---p 00000000 00:00 0
b77b4000-b77b5000 rw-p 00000000 00:00 0
b77c9000-b77cb000 rw-p 00000000 00:00 0
bfada000-bfafb000 rw-p 00000000 00:00 0          [stack]
Abortado


Aquí dejo mi código:


--- Código: C ---#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <string.h>#include <stdlib.h>#include <signal.h>#include <time.h>#include "funciones.c"  void quitHandler(int sig); int socketDes=-1; //socket del servidor int main(void){        /*---------------------------------------    Descriptor del socket y buffer de datos    ---------------------------------------*/                 struct sockaddr_in sockname, from;        char buffer[200];        int from_len;         struct hostent* host;         /*-----------------    Se abre el socket    -----------------*/        socketDes = socket (AF_INET, SOCK_STREAM, 0);    if (socketDes == -1)    {      perror ("No se puede abrir el socket servidor");      exit(-1);    }     /*------------------------------------------------------    Se rellenan los campos de la estructura con la IP del    servidor y el puerto del servicio que ofrecemos    ------------------------------------------------------*/     sockname.sin_family = AF_INET;    sockname.sin_port = htons(2050);    sockname.sin_addr.s_addr = INADDR_ANY;     if (bind (socketDes, (struct sockaddr*)&sockname, sizeof(sockname)) == -1)    {      perror("Error en la operacion bind");      close (socketDes);      exit(-1);    }       from_len = sizeof(from);     if (listen(socketDes,1) == -1)    {      perror("Error en la operacion de listen");      close (socketDes);      exit(-1);    }     signal(SIGINT, quitHandler);        signal(SIGTSTP, quitHandler);     /*--------------------------------      Aceptar peticiones de clientes      -------------------------------*/    char **refranes;    int numRefranes;    struct cliente infoCli;     int infoSelect;    int numClientesIn=0;     int socketEntrada, newSocket;     int i=0,j=0;     char kword[30];    char bufferAux[200];    char *cadAux, *cadAux1;    int index=0, index1=0;    char letra;     struct cliente auxCli;     fd_set sockIn;    fd_set sockAux;     FD_ZERO(&sockIn);    FD_ZERO(&sockAux);     FD_SET(socketDes,&sockIn);     refranes=extraeRefranes(&numRefranes);   //cargamos refranes desde fichero      while(1)   //bucle para el continuo analisis de peticiones de entrada    {        sockAux=sockIn;  //FD_COPY(&sockIn, &sockAux);         infoSelect=select(FD_SETSIZE,&sockIn,NULL,NULL,NULL);        if(infoSelect==-1)        {                perror("\nError en la funcion select()\n");                exit(1);        }        else        {                socketEntrada=buscarSocket(&sockIn);                if(socketEntrada>=0)                {                        if(recv(socketEntrada,buffer,200,0)==-1)                                printf("\nError en la recepcion con -recv-\n");                        else                        {                                i=0;                                        do                                        {                                                kword[i]=buffer[i];                                                i++;                                        }while(buffer[i]!=' ' && buffer[i]!='\0');                                        kword[i]='\0';                                         if(strcmp(kword, "USUARIO")==0)  //se introdujo la clave USUARIO                                        {                                                cadAux=buffer+8;                                                auxCli=buscaClienteNombre(cadAux);                                                 if(auxCli.registrado!=1)                                                {                                                        strcpy(buffer,"-Err. Usuario incorrecto");                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                perror("\nSe produjo un erro al enviar\n");                                                }                                                else                                                {                                                        if(auxCli.loggeado!=1)                                                        {                                                                auxCli.loggeado=1;                                                                auxCli.numSocket= socketEntrada;                                                                modificarCliente(auxCli);                                                        }                                                         strcpy(buffer,"-Ok. Usuario correcto");                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                perror("\nSe produjo un erro al enviar\n");                                                }                                                                                        }//fin opcion USUARIO                                         if(strcmp(kword,"PASSWORD")==0)  //se introdujo la clav PASSWORD                                        {                                                cadAux=buffer+9; //esta es la contraseña                                                 auxCli=buscaCliente(socketEntrada);                                                //puede ser NULL??????????????????????                                                if(auxCli.loggeado==1 && (strcmp(auxCli.passUser,cadAux)==0))                                                {                                                        strcpy(buffer, "+Ok. Usuario validado");                                            if(send(socketEntrada, buffer, 200, 0) == -1)                                                            perror("Error en el envio");                                                                                                                modificarCliente(auxCli);  //se incluye la informacion en el fichero                                                }                                                else                                                {                                                        strcpy(buffer, "-Err. Error en la validacion");                                            if(send(socketEntrada, buffer, 200, 0) == -1)                                                            perror("Error en el envio");                                                }                                                                                         }//fin opcion PASSWORD                                          if(strcmp(kword,"REGISTRO")==0)  //se introdujo la clave REGISTRO                                        {                                                for(i=0;i<=strlen(buffer);i++)                                                {                                                        if(buffer[i]=='-' && buffer[i+1]=='u')                                                        {                                                                index=i+3;                                                                cadAux=buffer+index; //aqui esta el usuario                                                        }                                                        if(buffer[i]=='-' && buffer[i+1]=='p')                                                        {                                                                cadAux1=buffer+(i+3); //aqui la contraseña                                                                index1=i;                                                        }                                                }                                                cadAux[index1-index-1]='\0';                                                 auxCli=buscaClienteNombre(cadAux);                                                 if(auxCli.registrado!=1)                                                {                                                        auxCli.numSocket=0;                                                        auxCli.jugando=0;                                                        auxCli.registrado=1;                                                        auxCli.loggeado=0;                                                        auxCli.autenticado=0;                                                        strcpy(auxCli.nombreUser,cadAux);                                                        strcpy(auxCli.passUser,cadAux1);                                                        auxCli.puntuacionPartida=0;                                                        auxCli.puntuacionTotal=0;                                                        auxCli.numIntentos=0;                                                        auxCli.numeroRefran=-1;                                                        auxCli.frasesAcertadas=0;                                                        auxCli.frasesFalladas=0;                                                        auxCli.modoJuego=-1;                                                         introduceCliente(auxCli);                                                         strcpy(buffer,"+Ok. Usuario registrado");                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                perror("Error envio confirmacion registro");                                                }                                                else                                                {                                                        strcpy(buffer,"-Err. Usuario ya existe");                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                perror("Error envio respuesta registro");                                                }                                                                                        } //fin opcion registro                                         if(strcmp(kword,"VOCAL")==0)                                        {                                                auxCli=buscaCliente(socketEntrada);                                                 letra=buffer[6];                                                if(letra=='a' || letra=='e' || letra=='i' || letra=='o' || letra=='u')                                                {                                                        if(auxCli.modoJuego==0)                                                        {                                                                if(compruebaLetra(refranes[auxCli.numeroRefran], auxCli.frasePartida, letra)==1)                                                                {                                                                        strcpy(buffer,"+Ok. Existe la vocal ---> ");                                                                        strcat(buffer,auxCli.frasePartida);                                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                                perror("\nError al enviar confirmacion vocal\n");                                                                }                                                                else                                                                {                                                                        strcpy(buffer,"-Err. No existe la vocal ---> ");                                                                        strcat(buffer,auxCli.frasePartida);                                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                                perror("\nError al enviar confirmacion vocal\n");                                                                }                                                                 auxCli.numIntentos++;                                                        }                                                }                                                else                                                {                                                        strcpy(buffer,"-Err. Mensaje invalido");                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                perror("\nError al enviar mensaje error\n");                                                }                                                                                          } //fin opcion VOCAL                                           if(strcmp(kword,"CONSONANTE")==0)                                        {                                                auxCli=buscaCliente(socketEntrada);                                                 letra=buffer[11];                                                if(letra!='a' && letra!='e' && letra!='i' && letra!='o' && letra!='u')                                                {                                                        if(auxCli.modoJuego==0)                                                        {                                                                if(compruebaLetra(refranes[auxCli.numeroRefran], auxCli.frasePartida, letra)==1)                                                                {                                                                        strcpy(buffer,"+Ok. Existe la consonante ---> ");                                                                        strcat(buffer,auxCli.frasePartida);                                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                                perror("\nError al enviar confirmacion consonante\n");                                                                }                                                                else                                                                {                                                                        strcpy(buffer,"-Err. No existe la consonante ---> ");                                                                        strcat(buffer,auxCli.frasePartida);                                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                                perror("\nError al enviar confirmacion consonante\n");                                                                }                                                                 auxCli.numIntentos++;                                                        }                                                }                                                else                                                {                                                        strcpy(buffer,"-Err. Mensaje invalido");                                                        if(send(socketEntrada,buffer,200,0)==-1)                                                                perror("\nError al enviar mensaje error\n");                                                }                                                                                         } //fin opcion CONSONANTE                                          if(strcmp(kword,"RESOLVER")==0)                                        {                                                auxCli=buscaCliente(socketEntrada);                                                 if(auxCli.modoJuego==0)                                                 {                                                        if(strcmp(buffer+9,refranes[auxCli.numeroRefran])==0)                                                        {                                                                if(auxCli.numIntentos<5)                                                                        auxCli.puntuacionPartida=150;                                                                if(auxCli.numIntentos>=5 && auxCli.numIntentos<=8)                                                                        auxCli.puntuacionPartida=100;                                                                if(auxCli.numIntentos>=9 && auxCli.numIntentos<=11)                                                                        auxCli.puntuacionPartida=70;                                                                if(auxCli.numIntentos>=12 && auxCli.numIntentos<=15)                                                                        auxCli.puntuacionPartida=50;                                                                if(auxCli.numIntentos>15)                                                                        auxCli.puntuacionPartida=0;                                                                 auxCli.frasesAcertadas++;                                                                auxCli.puntuacionTotal+=auxCli.puntuacionPartida;                                                                 sprintf(bufferAux,"+Ok. Enhorabuena\n\n Puntuacion en esta partida: %d\nPuntuacion total: %d\nIntentos realizados: %d\nFrases acertadas: %d\nFrases fallidas: %d",auxCli.puntuacionPartida,auxCli.puntuacionTotal,auxCli.numIntentos,auxCli.frasesAcertadas,auxCli.frasesFalladas);                                                                auxCli.puntuacionPartida=0;                                                                 if(send(socketEntrada,bufferAux,200,0)==-1)                                                                        perror("\nError al enviar estadisticas\n");                                                        }                                                        else                                                        {                                                                auxCli.frasesFalladas++;                                                                sprintf(bufferAux,"-Err. Mejor suerte la proxima vez\n\n Puntuacion en esta partida: %d\nPuntuacion total: %d\nIntentos realizados: %d\nFrases acertadas: %d\nFrases fallidas: %d",auxCli.puntuacionPartida,auxCli.puntuacionTotal,auxCli.numIntentos,auxCli.frasesAcertadas,auxCli.frasesFalladas);                                                                auxCli.puntuacionPartida=0;                                                                 if(send(socketEntrada,bufferAux,200,0)==-1)                                                                        perror("\nError al enviar estadisticas\n");                                                                 //reiniciamos la informacion del jugador                                                                auxCli.jugando=0;                                                                auxCli.modoJuego=-1;                                                                auxCli.puntuacionPartida=0;                                                                strcpy(auxCli.frasePartida,"");                                                                auxCli.numIntentos=0;                                                                auxCli.numeroRefran=-1;                                                         }                                                }                                                                                         } //fin opcion RESOLVER                                          if(strcmp(kword,"PARTIDA-INDIVIDUAL")==0)                                        {                                                auxCli=buscaCliente(socketEntrada);                                                 if(auxCli.loggeado==1 && auxCli.registrado==1 && auxCli.autenticado==1)                                                {                                                        if(auxCli.jugando==0)                                                        {                                                                auxCli.jugando=1;                                                                auxCli.modoJuego=0;                                                                 srand(time(NULL));                                                                auxCli.numeroRefran=rand()%numRefranes;                                                                 strcpy(buffer,"");                                                                j=0;                                                                for(i=0;i<strlen(refranes[auxCli.numeroRefran]);i++)                                                                {                                                                        switch(refranes[auxCli.numeroRefran][i])                                                                        {                                                                                case ',':                                                                                        buffer[i]=',';                                                                                        break;                                                                                case ' ':                                                                                        buffer[i]=' ';                                                                                        break;                                                                                case '.':                                                                                        buffer[i]='.';                                                                                default:                                                                                        buffer[i]='-';                                                                                        break;                                                                        }                                                                }                                                                buffer[i]='\0';                                                                strcpy(auxCli.frasePartida,buffer);                                                                 if (send(socketEntrada, buffer, 200, 0) == -1)                                                                        perror("\nError envio refran oculto\n");                                                        }                                                        else                                                        {                                                                strcpy(buffer, "-Err. Ya tiene una partida en curso");                                                             if(send(socketEntrada, buffer, 200, 0) == -1)                                                                        perror("Error en el envio");                                                        }                                                }                                                else                                                {                                                        strcpy(buffer, "-Err. Debe iniciar sesion antes de empezar");                                                    if(send(socketEntrada, buffer, 200, 0) == -1)                                                                perror("\nError en el envio fallo partida nueva\n");;                                                }                                                                                         } //fin opcion PARTIDA-INDIVIDUAL                                          if(strcmp(kword,"PARTIDA-GRUPO")==0)                                        {                                                //CODIGO PARA PARTIDA COLECTIVA                                        }                                         if(strcmp(kword,"SALIR")==0)                                        {                                                strcpy(buffer,"¡Hasta otra!");                                                if(send(socketEntrada,buffer,200,0)==-1)                                                        perror("\nError en el envio de mensaje salida\n");                                                close(socketEntrada);                                                FD_CLR(socketEntrada,&sockAux);                                                auxCli=buscaCliente(socketEntrada);                                                 if(auxCli.registrado==1)                                                {                                                        auxCli.numSocket=0;                                                        auxCli.jugando=0;                                                        auxCli.loggeado=0;                                                        auxCli.autenticado=0;                                                        auxCli.modoJuego=-1;                                                        strcpy(auxCli.frasePartida,"");                                                        auxCli.numeroRefran=-1;                                                        auxCli.frasesFalladas=0;                                                        auxCli.frasesAcertadas=0;                                                        auxCli.puntuacionPartida=0;                                                        auxCli.numIntentos=0;                                                }                                                 numClientesIn--;                                         } //fin opcion SALIR                         }//fin else de recepcion de mensaje                         sockIn=sockAux;//FD_COPY(&sockAux,&sockIn);                 }//fin if de existencia de socketEntrada                else  //si no esta en el conjunto de sockets                {                        if((newSocket=accept(socketDes,(struct sockaddr*)&from, &from_len))==-1)                        {                                printf("\nError aceptando peticion de conexion\n");                                exit(1);                        }                        else                                numClientesIn++;                        if(numClientesIn>50)                        {                                strcpy(buffer,"\n-Err. No se aceptan mas conexiones\n");                                if(send(newSocket,buffer,200,0)==-1)                                        perror("\nError envio negacion conexion\n");                                close(newSocket);                        }                        else                        {                                printf("\n+Ok. Aceptada una nueva conexion, usuario nº %d",numClientesIn);                                 auxCli.numSocket=newSocket;                                auxCli.jugando=0;                                auxCli.registrado=0;                                auxCli.loggeado=0;                                auxCli.autenticado=0;                                auxCli.modoJuego=-1;                                strcpy(auxCli.nombreUser,"");                                strcpy(auxCli.passUser,"");                                auxCli.puntuacionPartida=0;                                auxCli.puntuacionTotal=0;                                strcpy(auxCli.frasePartida,"");                                auxCli.numIntentos=0;                                auxCli.numeroRefran=-1;                                auxCli.frasesAcertadas=0;                                auxCli.frasesFalladas=0;                                 introduceCliente(auxCli);                        }                         sockIn=sockAux;//FD_COPY(&sockAux,&sockIn);                         if(numClientesIn<50)                                FD_SET(newSocket,&sockIn);                        sockAux=sockIn;//FD_COPY(&sockIn,&sockAux);                }        }    }    return 0; } void quitHandler (int sig){  close(socketDes);  printf("\nServidor terminado\n");  exit(0);} 



Gracias de antemano.

Un saludo!

Eternal Idol:
Depura tu programa con gdb, primero generalo en version de depuracion asi podras ver cual es la pila cuando se produce el error en cuestion:

http://cs.baylor.edu/~donahoo/tools/gdb/tutorial.html

Navegación

[0] Índice de Mensajes

Ir a la versión completa